// Make sure that buildPipelines defaults DockerImage.Config if needed to // avoid a nil panic. func TestBuildPipelinesWithUnresolvedImage(t *testing.T) { dockerParser := dockerfile.NewParser() dockerFileInput := strings.NewReader("EXPOSE 1234\nEXPOSE 4567") dockerFile, err := dockerParser.Parse(dockerFileInput) if err != nil { t.Fatal(err) } sourceRepo, err := app.NewSourceRepository("https://github.com/foo/bar.git") if err != nil { t.Fatal(err) } sourceRepo.BuildWithDocker() sourceRepo.SetInfo(&app.SourceRepositoryInfo{ Dockerfile: dockerFile, }) refs := app.ComponentReferences{ app.ComponentReference(&app.ComponentInput{ Value: "mysql", Uses: sourceRepo, ExpectToBuild: true, ResolvedMatch: &app.ComponentMatch{ Value: "mysql", }, }), } a := AppConfig{} group, err := a.buildPipelines(refs, app.Environment{}) if err != nil { t.Error(err) } expectedPorts := util.NewStringSet("1234", "4567") actualPorts := util.NewStringSet() for port := range group[0].InputImage.Info.Config.ExposedPorts { actualPorts.Insert(port) } if e, a := expectedPorts.List(), actualPorts.List(); !reflect.DeepEqual(e, a) { t.Errorf("Expected ports=%v, got %v", e, a) } }
func TestResolve(t *testing.T) { tests := []struct { name string cfg AppConfig components app.ComponentReferences expectedErr string }{ { name: "Resolver error", components: app.ComponentReferences{ app.ComponentReference(&app.ComponentInput{ Value: "mysql:invalid", Resolver: app.DockerRegistryResolver{ Client: dockerregistry.NewClient(), }, })}, expectedErr: `tag "invalid" has not been set`, }, { name: "Successful mysql builder", components: app.ComponentReferences{ app.ComponentReference(&app.ComponentInput{ Value: "mysql", Match: &app.ComponentMatch{ Builder: true, }, })}, expectedErr: "", }, { name: "Unable to build source code", components: app.ComponentReferences{ app.ComponentReference(&app.ComponentInput{ Value: "mysql", ExpectToBuild: true, })}, expectedErr: "no resolver", }, { name: "Successful docker build", cfg: AppConfig{ Strategy: "docker", }, components: app.ComponentReferences{ app.ComponentReference(&app.ComponentInput{ Value: "mysql", ExpectToBuild: true, })}, expectedErr: "", }, } for _, test := range tests { err := test.cfg.resolve(test.components) if err != nil { if !strings.Contains(err.Error(), test.expectedErr) { t.Errorf("%s: Invalid error: Expected %s, got %v", test.name, test.expectedErr, err) } } else if len(test.expectedErr) != 0 { t.Errorf("%s: Expected %s error but got none", test.name, test.expectedErr) } } }
func TestEnsureHasSource(t *testing.T) { tests := []struct { name string cfg AppConfig components app.ComponentReferences repositories []*app.SourceRepository expectedErr string }{ { name: "One requiresSource, multiple repositories", components: app.ComponentReferences{ app.ComponentReference(&app.ComponentInput{ ExpectToBuild: true, }), }, repositories: app.MockSourceRepositories(), expectedErr: "there are multiple code locations provided - use one of the following suggestions", }, { name: "Multiple requiresSource, multiple repositories", components: app.ComponentReferences{ app.ComponentReference(&app.ComponentInput{ ExpectToBuild: true, }), app.ComponentReference(&app.ComponentInput{ ExpectToBuild: true, }), }, repositories: app.MockSourceRepositories(), expectedErr: "Use '[image]~[repo]' to declare which code goes with which image", }, { name: "One requiresSource, no repositories", components: app.ComponentReferences{ app.ComponentReference(&app.ComponentInput{ ExpectToBuild: true, }), }, repositories: []*app.SourceRepository{}, expectedErr: "you must specify a repository via --code", }, { name: "Multiple requiresSource, no repositories", components: app.ComponentReferences{ app.ComponentReference(&app.ComponentInput{ ExpectToBuild: true, }), app.ComponentReference(&app.ComponentInput{ ExpectToBuild: true, }), }, repositories: []*app.SourceRepository{}, expectedErr: "you must provide at least one source code repository", }, { name: "Successful - one repository", components: app.ComponentReferences{ app.ComponentReference(&app.ComponentInput{ ExpectToBuild: false, }), }, repositories: []*app.SourceRepository{app.MockSourceRepositories()[0]}, expectedErr: "", }, { name: "Successful - no requiresSource", components: app.ComponentReferences{ app.ComponentReference(&app.ComponentInput{ ExpectToBuild: false, }), }, repositories: app.MockSourceRepositories(), expectedErr: "", }, } for _, test := range tests { err := test.cfg.ensureHasSource(test.components, test.repositories) if err != nil { if !strings.Contains(err.Error(), test.expectedErr) { t.Errorf("%s: Invalid error: Expected %s, got %v", test.name, test.expectedErr, err) } } else if len(test.expectedErr) != 0 { t.Errorf("%s: Expected %s error but got none", test.name, test.expectedErr) } } }
func TestNewAppResolve(t *testing.T) { tests := []struct { name string cfg cmd.AppConfig components app.ComponentReferences expectedErr string }{ { name: "Resolver error", components: app.ComponentReferences{ app.ComponentReference(&app.ComponentInput{ Value: "mysql:invalid", Resolver: app.UniqueExactOrInexactMatchResolver{ Searcher: app.DockerRegistrySearcher{ Client: dockerregistry.NewClient(10*time.Second, true), }, }, })}, expectedErr: `no match for "mysql:invalid`, }, { name: "Successful mysql builder", components: app.ComponentReferences{ app.ComponentReference(&app.ComponentInput{ Value: "mysql", ResolvedMatch: &app.ComponentMatch{ Builder: true, }, })}, expectedErr: "", }, { name: "Unable to build source code", components: app.ComponentReferences{ app.ComponentReference(&app.ComponentInput{ Value: "mysql", ExpectToBuild: true, })}, expectedErr: "no resolver", }, { name: "Successful docker build", cfg: cmd.AppConfig{ Strategy: "docker", }, components: app.ComponentReferences{ app.ComponentReference(&app.ComponentInput{ Value: "mysql", ExpectToBuild: true, })}, expectedErr: "", }, } for _, test := range tests { err := cmd.Resolve(test.components) if err != nil { if !strings.Contains(err.Error(), test.expectedErr) { t.Errorf("%s: Invalid error: Expected %s, got %v", test.name, test.expectedErr, err) } } else if len(test.expectedErr) != 0 { t.Errorf("%s: Expected %s error but got none", test.name, test.expectedErr) } } }
func TestEnsureHasSource(t *testing.T) { gitLocalDir := test.CreateLocalGitDirectory(t) defer os.RemoveAll(gitLocalDir) tests := []struct { name string cfg AppConfig components app.ComponentReferences repositories []*app.SourceRepository expectedErr string dontExpectToBuild bool }{ { name: "One requiresSource, multiple repositories", components: app.ComponentReferences{ app.ComponentReference(&app.ComponentInput{ ExpectToBuild: true, }), }, repositories: mockSourceRepositories(t, gitLocalDir), expectedErr: "there are multiple code locations provided - use one of the following suggestions", }, { name: "Multiple requiresSource, multiple repositories", components: app.ComponentReferences{ app.ComponentReference(&app.ComponentInput{ ExpectToBuild: true, }), app.ComponentReference(&app.ComponentInput{ ExpectToBuild: true, }), }, repositories: mockSourceRepositories(t, gitLocalDir), expectedErr: "Use '[image]~[repo]' to declare which code goes with which image", }, { name: "One requiresSource, no repositories", components: app.ComponentReferences{ app.ComponentReference(&app.ComponentInput{ ExpectToBuild: true, }), }, repositories: []*app.SourceRepository{}, expectedErr: "", dontExpectToBuild: true, }, { name: "Multiple requiresSource, no repositories", components: app.ComponentReferences{ app.ComponentReference(&app.ComponentInput{ ExpectToBuild: true, }), app.ComponentReference(&app.ComponentInput{ ExpectToBuild: true, }), }, repositories: []*app.SourceRepository{}, expectedErr: "", dontExpectToBuild: true, }, { name: "Successful - one repository", components: app.ComponentReferences{ app.ComponentReference(&app.ComponentInput{ ExpectToBuild: false, }), }, repositories: mockSourceRepositories(t, gitLocalDir)[:1], expectedErr: "", }, { name: "Successful - no requiresSource", components: app.ComponentReferences{ app.ComponentReference(&app.ComponentInput{ ExpectToBuild: false, }), }, repositories: mockSourceRepositories(t, gitLocalDir), expectedErr: "", }, } for _, test := range tests { err := EnsureHasSource(test.components, test.repositories, &test.cfg.GenerationInputs) if err != nil { if !strings.Contains(err.Error(), test.expectedErr) { t.Errorf("%s: Invalid error: Expected %s, got %v", test.name, test.expectedErr, err) } } else if len(test.expectedErr) != 0 { t.Errorf("%s: Expected %s error but got none", test.name, test.expectedErr) } if test.dontExpectToBuild { for _, comp := range test.components { if comp.NeedsSource() { t.Errorf("%s: expected component reference to not require source.", test.name) } } } } }