blob: 039f3118849d066ce28f18cf419c13961edd06bb [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dubbo_test
import (
"os"
"path/filepath"
"testing"
)
import (
"github.com/google/go-cmp/cmp"
)
import (
"github.com/apache/dubbo-kubernetes/app/dubboctl/internal/dubbo"
. "github.com/apache/dubbo-kubernetes/app/dubboctl/internal/testing"
)
const RepositoriesTestRepo = "repository.git"
// TestRepositories_List ensures the base case of listing
// repositories without error in the default scenario of builtin only.
func TestRepositories_List(t *testing.T) {
root, rm := Mktemp(t)
defer rm()
client := dubbo.New(dubbo.WithRepositoriesPath(root)) // Explicitly empty
rr, err := client.Repositories().List()
if err != nil {
t.Fatal(err)
}
// Assert contains only the default repo
if len(rr) != 1 && rr[0] != dubbo.DefaultRepositoryName {
t.Fatalf("Expected repository list '[%v]', got %v", dubbo.DefaultRepositoryName, rr)
}
}
// TestRepositories_GetInvalid ensures that attempting to get an invalid repo
// results in error.
func TestRepositories_GetInvalid(t *testing.T) {
client := dubbo.New(dubbo.WithRepositoriesPath("testdata/repositories"))
// invalid should error
_, err := client.Repositories().Get("invalid")
if err == nil {
t.Fatal("did not receive expected error getting invalid repository")
}
}
// TestRepositories_Get ensures a repository can be accessed by name.
func TestRepositories_Get(t *testing.T) {
client := dubbo.New(dubbo.WithRepositoriesPath("testdata/repositories"))
// valid should not error
repo, err := client.Repositories().Get("customTemplateRepo")
if err != nil {
t.Fatal(err)
}
// valid should have expected name
if repo.Name != "customTemplateRepo" {
t.Fatalf("Expected 'customTemplateRepo', got: %v", repo.Name)
}
}
// TestRepositories_All ensures repos are returned from
// .All accessor. Tests both builtin and building+extensible cases.
func TestRepositories_All(t *testing.T) {
uri := ServeRepo(RepositoriesTestRepo, t)
root, rm := Mktemp(t)
defer rm()
client := dubbo.New(dubbo.WithRepositoriesPath(root))
// Assert initially only the default is included
rr, err := client.Repositories().All()
if err != nil {
t.Fatal(err)
}
if len(rr) != 1 && rr[0].Name != dubbo.DefaultRepositoryName {
t.Fatalf("Expected initial repo list to be only the default. Got %v", rr)
}
// Add one
_, err = client.Repositories().Add("", uri)
if err != nil {
t.Fatal(err)
}
// Get full list
repositories, err := client.Repositories().All()
if err != nil {
t.Fatal(err)
}
// Assert it now includes both builtin and extended
if len(repositories) != 2 ||
repositories[0].Name != dubbo.DefaultRepositoryName ||
repositories[1].Name != "repository" {
t.Fatal("Repositories list does not pass shallow repository membership check")
}
}
// TestRepositories_Add checks basic adding of a repository by URI.
func TestRepositories_Add(t *testing.T) {
uri := ServeRepo(RepositoriesTestRepo, t) // ./testdata/$RepositoriesTestRepo.git
root, rm := Mktemp(t) // create and cd to a temp dir, returning path.
defer rm()
// Instantiate the client using the current temp directory as the
// repositories' root location.
client := dubbo.New(dubbo.WithRepositoriesPath(root))
// Add the repository, explicitly specifying a name. See other tests for
// defaulting from repository names and manifest-defined name.
if _, err := client.Repositories().Add("example", uri); err != nil {
t.Fatal(err)
}
// Confirm the list now contains the name
rr, err := client.Repositories().List()
if err != nil {
t.Fatal(err)
}
expected := []string{"default", "example"}
if diff := cmp.Diff(expected, rr); diff != "" {
t.Error("Repositories differed (-want, +got):", diff)
}
// assert a file exists at the location as well indicating it was added to
// the filesystem, not just the list.
if _, err := os.Stat(filepath.Join("example", "README.md")); os.IsNotExist(err) {
t.Fatalf("Repository does not appear on disk as expected: %v", err)
}
}
// TestRepositories_AddDefaultName ensures that repository name is optional,
// by default being set to the name of the repoisotory from the URI.
func TestRepositories_AddDeafultName(t *testing.T) {
// The test repository is the "base case" repo, which is a manifestless
// repo meant to exemplify the simplest use case: a repo with no metadata
// that simply contains templates, grouped by runtime. It therefore does
// not have a manifest and the default name will therefore be the repo name
uri := ServeRepo(RepositoriesTestRepo, t) // ./testdata/$RepositoriesTestRepo.git
root, rm := Mktemp(t)
defer rm()
client := dubbo.New(dubbo.WithRepositoriesPath(root))
name, err := client.Repositories().Add("", uri)
if err != nil {
t.Fatal(err)
}
// The name returned should be the repo name
if name != "repository" {
t.Fatalf("expected returned name '%v', got '%v'", RepositoriesTestRepo, name)
}
// The list of repositories should contain $RepositoriesTestRepo
rr, err := client.Repositories().List()
if err != nil {
t.Fatal(err)
}
expected := []string{"default", "repository"}
if diff := cmp.Diff(expected, rr); diff != "" {
t.Error("Repositories differed (-want, +got):", diff)
}
}
// TestRepositories_AddWithManifest ensures that a repository with
// a manifest wherein a default name is specified, is used as the name for the
// added repository when a name is not explicitly specified.
func TestRepositories_AddWithManifest(t *testing.T) {
// repository-b is meant to exemplify the use case of a repository which
// defines a custom language pack and makes full use of the manifest.yaml.
// The manifest.yaml is included which specifies things like custom templates
// location and (appropos to this test) a default name/
uri := ServeRepo("repository-a", t) // ./testdata/repository-a.git
root, rm := Mktemp(t)
defer rm()
client := dubbo.New(dubbo.WithRepositoriesPath(root))
name, err := client.Repositories().Add("", uri)
if err != nil {
t.Fatal(err)
}
// The name returned should be that defined in repository-b/manifest.yaml
expectedName := "defaultName"
if name != expectedName {
t.Fatalf("expected returned name '%v', got '%v'", expectedName, name)
}
// The list should include the name
rr, err := client.Repositories().List()
if err != nil {
t.Fatal(err)
}
expected := []string{"default", expectedName}
if diff := cmp.Diff(expected, rr); diff != "" {
t.Error("Repositories differed (-want, +got):", diff)
}
}
// TestRepositories_AddExistingErrors ensures that adding a repository that
// already exists yields an error.
func TestRepositories_AddExistingErrors(t *testing.T) {
uri := ServeRepo(RepositoriesTestRepo, t)
root, rm := Mktemp(t) // create and cd to a temp dir, returning path.
defer rm()
// Instantiate the client using the current temp directory as the
// repositories' root location.
client := dubbo.New(dubbo.WithRepositoriesPath(root))
// Add twice.
name := "example"
if _, err := client.Repositories().Add(name, uri); err != nil {
t.Fatal(err)
}
if _, err := client.Repositories().Add(name, uri); err == nil {
t.Fatalf("did not receive expected error adding an existing repository")
}
// assert repo named correctly
rr, err := client.Repositories().List()
if err != nil {
t.Fatal(err)
}
if len(rr) != 2 || rr[1] != name {
t.Fatalf("Expected '[%v]', got %v", name, rr)
}
// assert repo files exist
if _, err := os.Stat(filepath.Join(name, "README.md")); os.IsNotExist(err) {
t.Fatalf("Repository does not appear on disk as expected: %v", err)
}
}
// TestRepositories_Rename ensures renaming a repository succeeds.
func TestRepositories_Rename(t *testing.T) {
uri := ServeRepo(RepositoriesTestRepo, t)
root, rm := Mktemp(t) // create and cd to a temp dir, returning path.
defer rm()
// Instantiate the client using the current temp directory as the
// repositories' root location.
client := dubbo.New(dubbo.WithRepositoriesPath(root))
// Add and Rename
if _, err := client.Repositories().Add("foo", uri); err != nil {
t.Fatal(err)
}
if err := client.Repositories().Rename("foo", "bar"); err != nil {
t.Fatal(err)
}
// assert repo named correctly
rr, err := client.Repositories().List()
if err != nil {
t.Fatal(err)
}
if len(rr) != 2 || rr[1] != "bar" {
t.Fatalf("Expected '[bar]', got %v", rr)
}
// assert repo files exist
if _, err := os.Stat(filepath.Join("bar", "README.md")); os.IsNotExist(err) {
t.Fatalf("Repository does not appear on disk as expected: %v", err)
}
}
// TestRepositories_Remove ensures that removing a repository by name
// removes it from the list and FS.
func TestRepositories_Remove(t *testing.T) {
uri := ServeRepo(RepositoriesTestRepo, t) // ./testdata/repository.git
root, rm := Mktemp(t) // create and cd to a temp dir
defer rm()
// Instantiate the client using the current temp directory as the
// repositories' root location.
client := dubbo.New(dubbo.WithRepositoriesPath(root))
// Add and Remove
name := "example"
if _, err := client.Repositories().Add(name, uri); err != nil {
t.Fatal(err)
}
if err := client.Repositories().Remove(name); err != nil {
t.Fatal(err)
}
// assert repo not in list
rr, err := client.Repositories().List()
if err != nil {
t.Fatal(err)
}
if len(rr) != 1 {
t.Fatalf("Expected repo list of len 1. Got %v", rr)
}
// assert repo not on filesystem
if _, err := os.Stat(name); !os.IsNotExist(err) {
t.Fatalf("Repo %v still exists on filesystem.", name)
}
}
// TestRepositories_URL ensures that a repository populates its URL member
// from the git repository's origin url (if it is a git repo and exists)
func TestRepositories_URL(t *testing.T) {
uri := ServeRepo(RepositoriesTestRepo, t)
root, rm := Mktemp(t)
defer rm()
client := dubbo.New(dubbo.WithRepositoriesPath(root))
// Add the test repo
_, err := client.Repositories().Add("newrepo", uri)
if err != nil {
t.Fatal(err)
}
// Get the newly added repo
r, err := client.Repositories().Get("newrepo")
if err != nil {
t.Fatal(err)
}
// Assert it includes the correct URL, including the refspec fragment
if r.URL() != uri+"#master" {
t.Fatalf("expected repository URL '%v#master', got '%v'", uri, r.URL())
}
}
// TestRepositories_Missing ensures that a missing repositores directory
// does not cause an error unless it was explicitly set (zero value indicates
// no repos should be loaded from os).
// This may change in an upcoming release where the repositories directory
// will be created at the config path if it does not exist, but this requires
// first moving the defaulting path logic from CLI into the client lib.
func TestRepositories_Missing(t *testing.T) {
// Client with no repositories path defined.
client := dubbo.New()
// Get all repositories
_, err := client.Repositories().All()
if err != nil {
t.Fatal(err)
}
}