github.com/freiheit-com/kuberpult@v1.24.2-0.20240328135542-315d5630abe6/services/cd-service/pkg/service/git_test.go (about)

     1  /*This file is part of kuberpult.
     2  
     3  Kuberpult is free software: you can redistribute it and/or modify
     4  it under the terms of the Expat(MIT) License as published by
     5  the Free Software Foundation.
     6  
     7  Kuberpult is distributed in the hope that it will be useful,
     8  but WITHOUT ANY WARRANTY; without even the implied warranty of
     9  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    10  MIT License for more details.
    11  
    12  You should have received a copy of the MIT License
    13  along with kuberpult. If not, see <https://directory.fsf.org/wiki/License:Expat>.
    14  
    15  Copyright 2023 freiheit.com*/
    16  
    17  package service
    18  
    19  import (
    20  	"fmt"
    21  	"sort"
    22  	"testing"
    23  	"time"
    24  
    25  	"github.com/freiheit-com/kuberpult/services/cd-service/pkg/repository/testutil"
    26  	"github.com/google/go-cmp/cmp"
    27  	"github.com/google/go-cmp/cmp/cmpopts"
    28  
    29  	api "github.com/freiheit-com/kuberpult/pkg/api/v1"
    30  	"github.com/freiheit-com/kuberpult/pkg/uuid"
    31  
    32  	"google.golang.org/grpc/codes"
    33  	"google.golang.org/grpc/status"
    34  	"google.golang.org/protobuf/testing/protocmp"
    35  
    36  	"github.com/freiheit-com/kuberpult/pkg/ptr"
    37  	"github.com/freiheit-com/kuberpult/services/cd-service/pkg/config"
    38  	rp "github.com/freiheit-com/kuberpult/services/cd-service/pkg/repository"
    39  )
    40  
    41  func TestGetProductOverview(t *testing.T) {
    42  	tcs := []struct {
    43  		Name                   string
    44  		givenEnv               *string
    45  		givenEnvGroup          *string
    46  		expectedProductSummary []api.ProductSummary
    47  		expectedErr            error
    48  		Setup                  []rp.Transformer
    49  	}{
    50  		{
    51  			Name:        "get Product Overview with no env or envGroup",
    52  			expectedErr: fmt.Errorf("Must have an environment or environmentGroup to get the product summary for"),
    53  		},
    54  		{
    55  			Name:        "get Product Overview with no commitHash",
    56  			givenEnv:    ptr.FromString("testing"),
    57  			expectedErr: fmt.Errorf("Must have a commit to get the product summary for"),
    58  		},
    59  		{
    60  			Name:          "get Product Overview with both env and envGroup",
    61  			givenEnv:      ptr.FromString("testing"),
    62  			givenEnvGroup: ptr.FromString("testingGroup"),
    63  			expectedErr:   fmt.Errorf("Can not have both an environment and environmentGroup to get the product summary for"),
    64  		},
    65  		{
    66  			Name:     "get Product Overview as expected with env",
    67  			givenEnv: ptr.FromString("development"),
    68  			Setup: []rp.Transformer{
    69  				&rp.CreateEnvironment{
    70  					Environment: "development",
    71  					Config: config.EnvironmentConfig{
    72  						Upstream: &config.EnvironmentConfigUpstream{
    73  							Latest: true,
    74  						},
    75  						ArgoCd:           nil,
    76  						EnvironmentGroup: ptr.FromString("dev"),
    77  					},
    78  				},
    79  				&rp.CreateApplicationVersion{
    80  					Application: "test",
    81  					Manifests: map[string]string{
    82  						"development": "dev",
    83  					},
    84  					SourceAuthor:    "example <example@example.com>",
    85  					SourceCommitId:  "testing25",
    86  					SourceMessage:   "changed something (#678)",
    87  					SourceRepoUrl:   "testing@testing.com/abc",
    88  					DisplayVersion:  "v1.0.2",
    89  					Team:            "sre-team",
    90  					WriteCommitData: true,
    91  				},
    92  				&rp.DeployApplicationVersion{
    93  					Application: "test",
    94  					Environment: "development",
    95  					Version:     1,
    96  				},
    97  			},
    98  			expectedProductSummary: []api.ProductSummary{{App: "test", Version: "1", DisplayVersion: "v1.0.2", CommitId: "testing25", Team: "sre-team"}},
    99  		},
   100  		{
   101  			Name:     "get Product Overview as expected with env but without team",
   102  			givenEnv: ptr.FromString("development"),
   103  			Setup: []rp.Transformer{
   104  				&rp.CreateEnvironment{
   105  					Environment: "development",
   106  					Config: config.EnvironmentConfig{
   107  						Upstream: &config.EnvironmentConfigUpstream{
   108  							Latest: true,
   109  						},
   110  						ArgoCd:           nil,
   111  						EnvironmentGroup: ptr.FromString("dev"),
   112  					},
   113  				},
   114  				&rp.CreateApplicationVersion{
   115  					Application: "test",
   116  					Manifests: map[string]string{
   117  						"development": "dev",
   118  					},
   119  					SourceAuthor:    "example <example@example.com>",
   120  					SourceCommitId:  "testing25",
   121  					SourceMessage:   "changed something (#678)",
   122  					SourceRepoUrl:   "testing@testing.com/abc",
   123  					DisplayVersion:  "v1.0.2",
   124  					WriteCommitData: true,
   125  				},
   126  				&rp.DeployApplicationVersion{
   127  					Application: "test",
   128  					Environment: "development",
   129  					Version:     1,
   130  				},
   131  			},
   132  			expectedProductSummary: []api.ProductSummary{{App: "test", Version: "1", DisplayVersion: "v1.0.2", CommitId: "testing25", Team: ""}},
   133  		},
   134  		{
   135  			Name:     "invalid environment used",
   136  			givenEnv: ptr.FromString("staging"),
   137  			Setup: []rp.Transformer{
   138  				&rp.CreateEnvironment{
   139  					Environment: "development",
   140  					Config: config.EnvironmentConfig{
   141  						Upstream: &config.EnvironmentConfigUpstream{
   142  							Latest: true,
   143  						},
   144  						ArgoCd:           nil,
   145  						EnvironmentGroup: ptr.FromString("dev"),
   146  					},
   147  				},
   148  				&rp.CreateApplicationVersion{
   149  					Application: "test",
   150  					Manifests: map[string]string{
   151  						"development": "dev",
   152  					},
   153  					SourceAuthor:    "example <example@example.com>",
   154  					SourceCommitId:  "testing25",
   155  					SourceMessage:   "changed something (#678)",
   156  					SourceRepoUrl:   "testing@testing.com/abc",
   157  					DisplayVersion:  "v1.0.2",
   158  					WriteCommitData: true,
   159  				},
   160  				&rp.DeployApplicationVersion{
   161  					Application: "test",
   162  					Environment: "development",
   163  					Version:     1,
   164  				},
   165  			},
   166  			expectedProductSummary: []api.ProductSummary{},
   167  		},
   168  		{
   169  			Name:          "get Product Overview as expected with envGroup",
   170  			givenEnvGroup: ptr.FromString("dev"),
   171  			Setup: []rp.Transformer{
   172  				&rp.CreateEnvironment{
   173  					Environment: "development",
   174  					Config: config.EnvironmentConfig{
   175  						Upstream: &config.EnvironmentConfigUpstream{
   176  							Latest: true,
   177  						},
   178  						ArgoCd:           nil,
   179  						EnvironmentGroup: ptr.FromString("dev"),
   180  					},
   181  				},
   182  				&rp.CreateApplicationVersion{
   183  					Application: "test",
   184  					Manifests: map[string]string{
   185  						"development": "dev",
   186  					},
   187  					SourceAuthor:    "example <example@example.com>",
   188  					SourceCommitId:  "testing25",
   189  					SourceMessage:   "changed something (#678)",
   190  					SourceRepoUrl:   "testing@testing.com/abc",
   191  					DisplayVersion:  "v1.0.2",
   192  					Team:            "sre-team",
   193  					WriteCommitData: true,
   194  				},
   195  				&rp.DeployApplicationVersion{
   196  					Application: "test",
   197  					Environment: "development",
   198  					Version:     1,
   199  				},
   200  			},
   201  			expectedProductSummary: []api.ProductSummary{{App: "test", Version: "1", DisplayVersion: "v1.0.2", CommitId: "testing25", Team: "sre-team"}},
   202  		},
   203  		{
   204  			Name:          "invalid envGroup used",
   205  			givenEnvGroup: ptr.FromString("notDev"),
   206  			Setup: []rp.Transformer{
   207  				&rp.CreateEnvironment{
   208  					Environment: "development",
   209  					Config: config.EnvironmentConfig{
   210  						Upstream: &config.EnvironmentConfigUpstream{
   211  							Latest: true,
   212  						},
   213  						ArgoCd:           nil,
   214  						EnvironmentGroup: ptr.FromString("dev"),
   215  					},
   216  				},
   217  				&rp.CreateApplicationVersion{
   218  					Application: "test",
   219  					Manifests: map[string]string{
   220  						"development": "dev",
   221  					},
   222  					SourceAuthor:    "example <example@example.com>",
   223  					SourceCommitId:  "testing25",
   224  					SourceMessage:   "changed something (#678)",
   225  					SourceRepoUrl:   "testing@testing.com/abc",
   226  					DisplayVersion:  "v1.0.2",
   227  					WriteCommitData: true,
   228  				},
   229  				&rp.DeployApplicationVersion{
   230  					Application: "test",
   231  					Environment: "development",
   232  					Version:     1,
   233  				},
   234  			},
   235  			expectedProductSummary: []api.ProductSummary{},
   236  		},
   237  	}
   238  	for _, tc := range tcs {
   239  		tc := tc
   240  		t.Run(tc.Name, func(t *testing.T) {
   241  			shutdown := make(chan struct{}, 1)
   242  			repo, err := setupRepositoryTest(t)
   243  			if err != nil {
   244  				t.Fatalf("error setting up repository test: %v", err)
   245  			}
   246  			sv := &GitServer{OverviewService: &OverviewServiceServer{Repository: repo, Shutdown: shutdown}}
   247  
   248  			for _, transformer := range tc.Setup {
   249  				repo.Apply(testutil.MakeTestContext(), transformer)
   250  			}
   251  			ov, err := sv.OverviewService.GetOverview(testutil.MakeTestContext(), &api.GetOverviewRequest{})
   252  			if err != nil {
   253  				t.Errorf("expected no error, got %s", err)
   254  			}
   255  			productSummary, err := sv.GetProductSummary(testutil.MakeTestContext(), &api.GetProductSummaryRequest{CommitHash: ov.GitRevision, Environment: tc.givenEnv, EnvironmentGroup: tc.givenEnvGroup})
   256  			if err != nil && tc.expectedErr == nil {
   257  				t.Fatalf("expected no error, but got [%s]: %v", ov.GitRevision, err)
   258  			}
   259  			if err != nil && err.Error() != tc.expectedErr.Error() {
   260  				t.Fatalf("expected the error [%v] but got [%v]", tc.expectedErr, err)
   261  			}
   262  			if productSummary != nil && len(tc.expectedProductSummary) > 0 {
   263  				for iter := range productSummary.ProductSummary {
   264  					if productSummary.ProductSummary[iter].App != tc.expectedProductSummary[iter].App {
   265  						t.Fatalf("expected [%v] for productSummary app name but got [%v]", tc.expectedProductSummary[iter].App, productSummary.ProductSummary[iter].App)
   266  					}
   267  					if productSummary.ProductSummary[iter].Version != tc.expectedProductSummary[iter].Version {
   268  						t.Fatalf("expected [%v] for productSummary app name but got [%v]", tc.expectedProductSummary[iter].Version, productSummary.ProductSummary[iter].Version)
   269  					}
   270  				}
   271  			}
   272  		})
   273  	}
   274  }
   275  
   276  func fixedTime() time.Time {
   277  	return time.Unix(666, 0)
   278  }
   279  func TestGetCommitInfo(t *testing.T) {
   280  	environmentSetup := []rp.Transformer{
   281  		&rp.CreateEnvironment{
   282  			Environment: "development-1",
   283  			Config: config.EnvironmentConfig{
   284  				Upstream: &config.EnvironmentConfigUpstream{
   285  					Latest: true,
   286  				},
   287  				EnvironmentGroup: ptr.FromString("development"),
   288  			},
   289  		},
   290  		&rp.CreateEnvironment{
   291  			Environment: "development-2",
   292  			Config: config.EnvironmentConfig{
   293  				Upstream: &config.EnvironmentConfigUpstream{
   294  					Latest: true,
   295  				},
   296  				EnvironmentGroup: ptr.FromString("development"),
   297  			},
   298  		},
   299  		&rp.CreateEnvironment{
   300  			Environment: "development-3",
   301  			Config: config.EnvironmentConfig{
   302  				Upstream: &config.EnvironmentConfigUpstream{
   303  					Latest: true,
   304  				},
   305  				EnvironmentGroup: ptr.FromString("development"),
   306  			},
   307  		},
   308  
   309  		&rp.CreateEnvironment{
   310  			Environment: "staging-1",
   311  			Config: config.EnvironmentConfig{
   312  				Upstream: &config.EnvironmentConfigUpstream{
   313  					Environment: "development-1",
   314  				},
   315  				EnvironmentGroup: ptr.FromString("staging"),
   316  			},
   317  		},
   318  	}
   319  
   320  	type TestCase struct {
   321  		name                   string
   322  		transformers           []rp.Transformer
   323  		request                *api.GetCommitInfoRequest
   324  		allowReadingCommitData bool
   325  		expectedResponse       *api.GetCommitInfoResponse
   326  		expectedError          error
   327  	}
   328  
   329  	tcs := []TestCase{
   330  		{
   331  			name: "create one commit with one app and get its info",
   332  			transformers: []rp.Transformer{
   333  				&rp.CreateApplicationVersion{
   334  					Application:    "app",
   335  					SourceCommitId: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
   336  					SourceMessage:  "some message",
   337  					Manifests: map[string]string{
   338  						"development-1": "dev-manifest",
   339  					},
   340  					WriteCommitData: true,
   341  				},
   342  			},
   343  			request: &api.GetCommitInfoRequest{
   344  				CommitHash: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
   345  			},
   346  			allowReadingCommitData: true,
   347  			expectedError:          nil,
   348  			expectedResponse: &api.GetCommitInfoResponse{
   349  				CommitHash:    "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
   350  				CommitMessage: "some message",
   351  				TouchedApps: []string{
   352  					"app",
   353  				},
   354  				Events: []*api.Event{
   355  					{
   356  						Uuid:      "00000000-0000-0000-0000-000000000000",
   357  						CreatedAt: uuid.TimeFromUUID("00000000-0000-0000-0000-000000000000"),
   358  						EventType: &api.Event_CreateReleaseEvent{
   359  							CreateReleaseEvent: &api.CreateReleaseEvent{
   360  								EnvironmentNames: []string{"development-1"},
   361  							},
   362  						},
   363  					},
   364  					{
   365  						Uuid:      "00000000-0000-0000-0000-000000000001",
   366  						CreatedAt: uuid.TimeFromUUID("00000000-0000-0000-0000-000000000001"),
   367  						EventType: &api.Event_DeploymentEvent{
   368  							DeploymentEvent: &api.DeploymentEvent{
   369  								Application:        "app",
   370  								TargetEnvironment:  "development-1",
   371  								ReleaseTrainSource: nil,
   372  							},
   373  						},
   374  					},
   375  				},
   376  			},
   377  		},
   378  		{
   379  			name: "create one commit with several apps and get its info",
   380  			transformers: []rp.Transformer{
   381  				&rp.CreateApplicationVersion{
   382  					Application:    "app-1",
   383  					SourceCommitId: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
   384  					SourceMessage:  "some message",
   385  					Manifests: map[string]string{
   386  						"development-1": "dev-manifest1",
   387  					},
   388  					WriteCommitData: true,
   389  				},
   390  				&rp.CreateApplicationVersion{
   391  					Application:    "app-2",
   392  					SourceCommitId: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
   393  					SourceMessage:  "some message",
   394  					Manifests: map[string]string{
   395  						"development-2": "dev-manifest2",
   396  					},
   397  					WriteCommitData: true,
   398  				},
   399  				&rp.CreateApplicationVersion{
   400  					Application:    "app-3",
   401  					SourceCommitId: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
   402  					SourceMessage:  "some message",
   403  					Manifests: map[string]string{
   404  						"development-3": "dev-manifest3",
   405  					},
   406  					WriteCommitData: true,
   407  				},
   408  			},
   409  			request: &api.GetCommitInfoRequest{
   410  				CommitHash: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
   411  			},
   412  			allowReadingCommitData: true,
   413  			expectedError:          nil,
   414  			expectedResponse: &api.GetCommitInfoResponse{
   415  				CommitHash:    "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
   416  				CommitMessage: "some message",
   417  				TouchedApps: []string{
   418  					"app-1",
   419  					"app-2",
   420  					"app-3",
   421  				},
   422  				Events: []*api.Event{
   423  					{
   424  						Uuid:      "00000000-0000-0000-0000-000000000000",
   425  						CreatedAt: uuid.TimeFromUUID("00000000-0000-0000-0000-000000000000"),
   426  						EventType: &api.Event_CreateReleaseEvent{
   427  							CreateReleaseEvent: &api.CreateReleaseEvent{
   428  								EnvironmentNames: []string{"development-1"},
   429  							},
   430  						},
   431  					},
   432  					{
   433  						Uuid:      "00000000-0000-0000-0000-000000000001",
   434  						CreatedAt: uuid.TimeFromUUID("00000000-0000-0000-0000-000000000001"),
   435  						EventType: &api.Event_DeploymentEvent{
   436  							DeploymentEvent: &api.DeploymentEvent{
   437  								Application:        "app-1",
   438  								TargetEnvironment:  "development-1",
   439  								ReleaseTrainSource: nil,
   440  							},
   441  						},
   442  					},
   443  					{
   444  						Uuid:      "00000000-0000-0000-0000-000000000002",
   445  						CreatedAt: uuid.TimeFromUUID("00000000-0000-0000-0000-000000000002"),
   446  						EventType: &api.Event_CreateReleaseEvent{
   447  							CreateReleaseEvent: &api.CreateReleaseEvent{
   448  								EnvironmentNames: []string{"development-2"},
   449  							},
   450  						},
   451  					},
   452  					{
   453  						Uuid:      "00000000-0000-0000-0000-000000000003",
   454  						CreatedAt: uuid.TimeFromUUID("00000000-0000-0000-0000-000000000003"),
   455  						EventType: &api.Event_DeploymentEvent{
   456  							DeploymentEvent: &api.DeploymentEvent{
   457  								Application:        "app-2",
   458  								TargetEnvironment:  "development-2",
   459  								ReleaseTrainSource: nil,
   460  							},
   461  						},
   462  					},
   463  					{
   464  						Uuid:      "00000000-0000-0000-0000-000000000004",
   465  						CreatedAt: uuid.TimeFromUUID("00000000-0000-0000-0000-000000000004"),
   466  						EventType: &api.Event_CreateReleaseEvent{
   467  							CreateReleaseEvent: &api.CreateReleaseEvent{
   468  								EnvironmentNames: []string{"development-3"},
   469  							},
   470  						},
   471  					},
   472  					{
   473  						Uuid:      "00000000-0000-0000-0000-000000000005",
   474  						CreatedAt: uuid.TimeFromUUID("00000000-0000-0000-0000-000000000005"),
   475  						EventType: &api.Event_DeploymentEvent{
   476  							DeploymentEvent: &api.DeploymentEvent{
   477  								Application:        "app-3",
   478  								TargetEnvironment:  "development-3",
   479  								ReleaseTrainSource: nil,
   480  							},
   481  						},
   482  					},
   483  				},
   484  			},
   485  		},
   486  		{
   487  			name: "create one commit with one app but get the info of a nonexistent commit",
   488  			transformers: []rp.Transformer{
   489  				&rp.CreateApplicationVersion{
   490  					Application:     "app",
   491  					SourceCommitId:  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
   492  					SourceMessage:   "some message",
   493  					WriteCommitData: true,
   494  				},
   495  			},
   496  			request: &api.GetCommitInfoRequest{
   497  				CommitHash: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
   498  			},
   499  			allowReadingCommitData: true,
   500  			expectedError:          status.Error(codes.NotFound, "error: commit bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb was not found in the manifest repo"),
   501  			expectedResponse:       nil,
   502  		},
   503  		{
   504  			name: "find a commit by prefix",
   505  			transformers: []rp.Transformer{
   506  				&rp.CreateApplicationVersion{
   507  					Application:     "app",
   508  					SourceCommitId:  "32a5b7b27fe0e7c328e8ec4615cb34750bc328bd",
   509  					SourceMessage:   "some message",
   510  					WriteCommitData: true,
   511  				},
   512  			},
   513  			request: &api.GetCommitInfoRequest{
   514  				CommitHash: "32a5b7b27",
   515  			},
   516  			allowReadingCommitData: true,
   517  			expectedResponse: &api.GetCommitInfoResponse{
   518  				CommitHash:    "32a5b7b27fe0e7c328e8ec4615cb34750bc328bd",
   519  				CommitMessage: "some message",
   520  				TouchedApps:   []string{"app"},
   521  				Events: []*api.Event{
   522  					{
   523  						Uuid:      "00000000-0000-0000-0000-000000000000",
   524  						CreatedAt: uuid.TimeFromUUID("00000000-0000-0000-0000-000000000000"),
   525  						EventType: &api.Event_CreateReleaseEvent{
   526  							CreateReleaseEvent: &api.CreateReleaseEvent{},
   527  						},
   528  					},
   529  				},
   530  			},
   531  		},
   532  		{
   533  			name: "no commit info returned if feature toggle not set",
   534  			transformers: []rp.Transformer{
   535  				&rp.CreateApplicationVersion{
   536  					Application:    "app",
   537  					SourceCommitId: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
   538  					SourceMessage:  "some message",
   539  					Manifests: map[string]string{
   540  						"development-1": "dev-manifest",
   541  					},
   542  					WriteCommitData: true, // we still write the info …
   543  				},
   544  			},
   545  			request: &api.GetCommitInfoRequest{
   546  				CommitHash: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
   547  			},
   548  			allowReadingCommitData: false, // … but do not return it
   549  			expectedError:          status.Error(codes.FailedPrecondition, "no written commit info available; set KUBERPULT_GIT_WRITE_COMMIT_DATA=true to enable"),
   550  			expectedResponse:       nil,
   551  		},
   552  		{
   553  			name: "no commit info written if toggle not set",
   554  			transformers: []rp.Transformer{
   555  				&rp.CreateApplicationVersion{
   556  					Application:    "app",
   557  					SourceCommitId: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
   558  					SourceMessage:  "some message",
   559  					Manifests: map[string]string{
   560  						"development-1": "dev-manifest",
   561  					},
   562  					WriteCommitData: false, // do not write commit data …
   563  				},
   564  			},
   565  			request: &api.GetCommitInfoRequest{
   566  				CommitHash: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
   567  			},
   568  			allowReadingCommitData: true, // … but attempt to read anyway
   569  			expectedError:          status.Error(codes.NotFound, "error: commit aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa was not found in the manifest repo"),
   570  			expectedResponse:       nil,
   571  		},
   572  		{
   573  			name: "events for release trains on environments are correctly retrieved by GetCommitInfo",
   574  			transformers: []rp.Transformer{
   575  				&rp.CreateApplicationVersion{
   576  					Application: "app",
   577  					Manifests: map[string]string{
   578  						"development-1": "manifest 1",
   579  						"staging-1":     "manifest 2",
   580  					},
   581  					SourceCommitId:  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
   582  					WriteCommitData: true,
   583  				},
   584  				&rp.CreateApplicationVersion{
   585  					Application: "app",
   586  					Manifests: map[string]string{
   587  						"development-1": "manifest 1",
   588  						"staging-1":     "manifest 2",
   589  					},
   590  					SourceCommitId:  "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
   591  					WriteCommitData: true,
   592  				},
   593  				&rp.ReleaseTrain{
   594  					Target:          "staging-1",
   595  					WriteCommitData: true,
   596  				},
   597  			},
   598  			allowReadingCommitData: true,
   599  			request: &api.GetCommitInfoRequest{
   600  				CommitHash: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
   601  			},
   602  			expectedResponse: &api.GetCommitInfoResponse{
   603  				CommitHash:    "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
   604  				CommitMessage: "",
   605  				TouchedApps: []string{
   606  					"app",
   607  				},
   608  				Events: []*api.Event{
   609  					{
   610  						Uuid:      "00000000-0000-0000-0000-000000000002",
   611  						CreatedAt: uuid.TimeFromUUID("00000000-0000-0000-0000-000000000002"),
   612  						EventType: &api.Event_CreateReleaseEvent{
   613  							CreateReleaseEvent: &api.CreateReleaseEvent{
   614  								EnvironmentNames: []string{
   615  									"development-1",
   616  									"staging-1",
   617  								},
   618  							},
   619  						},
   620  					},
   621  					{
   622  						Uuid:      "00000000-0000-0000-0000-000000000003",
   623  						CreatedAt: uuid.TimeFromUUID("00000000-0000-0000-0000-000000000003"),
   624  						EventType: &api.Event_DeploymentEvent{
   625  							DeploymentEvent: &api.DeploymentEvent{
   626  								Application:        "app",
   627  								TargetEnvironment:  "development-1",
   628  								ReleaseTrainSource: nil,
   629  							},
   630  						},
   631  					},
   632  
   633  					{
   634  						Uuid:      "00000000-0000-0000-0000-000000000005",
   635  						CreatedAt: uuid.TimeFromUUID("00000000-0000-0000-0000-000000000005"),
   636  						EventType: &api.Event_DeploymentEvent{
   637  							DeploymentEvent: &api.DeploymentEvent{
   638  								Application:       "app",
   639  								TargetEnvironment: "staging-1",
   640  								ReleaseTrainSource: &api.DeploymentEvent_ReleaseTrainSource{
   641  									UpstreamEnvironment:    "development-1",
   642  									TargetEnvironmentGroup: nil,
   643  								},
   644  							},
   645  						},
   646  					},
   647  				},
   648  			},
   649  		},
   650  		{
   651  			name: "release trains on environment groups are correctly retrieved by GetCommitInfo",
   652  			transformers: []rp.Transformer{
   653  				&rp.CreateApplicationVersion{
   654  					Application: "app",
   655  					Manifests: map[string]string{
   656  						"development-1": "manifest 1",
   657  						"staging-1":     "manifest 2",
   658  					},
   659  					SourceCommitId:  "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
   660  					WriteCommitData: true,
   661  				},
   662  				&rp.CreateApplicationVersion{
   663  					Application: "app",
   664  					Manifests: map[string]string{
   665  						"development-1": "manifest 1",
   666  						"staging-1":     "manifest 2",
   667  					},
   668  					SourceCommitId:  "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
   669  					WriteCommitData: true,
   670  				},
   671  				&rp.ReleaseTrain{
   672  					Target:          "staging",
   673  					WriteCommitData: true,
   674  				},
   675  			},
   676  			allowReadingCommitData: true,
   677  			request: &api.GetCommitInfoRequest{
   678  				CommitHash: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
   679  			},
   680  			expectedResponse: &api.GetCommitInfoResponse{
   681  				CommitHash:    "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
   682  				CommitMessage: "",
   683  				TouchedApps: []string{
   684  					"app",
   685  				},
   686  				Events: []*api.Event{
   687  					{
   688  						Uuid:      "00000000-0000-0000-0000-000000000002",
   689  						CreatedAt: uuid.TimeFromUUID("00000000-0000-0000-0000-000000000002"),
   690  						EventType: &api.Event_CreateReleaseEvent{
   691  							CreateReleaseEvent: &api.CreateReleaseEvent{
   692  								EnvironmentNames: []string{
   693  									"development-1",
   694  									"staging-1",
   695  								},
   696  							},
   697  						},
   698  					},
   699  					{
   700  						Uuid:      "00000000-0000-0000-0000-000000000003",
   701  						CreatedAt: uuid.TimeFromUUID("00000000-0000-0000-0000-000000000003"),
   702  						EventType: &api.Event_DeploymentEvent{
   703  							DeploymentEvent: &api.DeploymentEvent{
   704  								Application:        "app",
   705  								TargetEnvironment:  "development-1",
   706  								ReleaseTrainSource: nil,
   707  							},
   708  						},
   709  					},
   710  
   711  					{
   712  						Uuid:      "00000000-0000-0000-0000-000000000005",
   713  						CreatedAt: uuid.TimeFromUUID("00000000-0000-0000-0000-000000000005"),
   714  						EventType: &api.Event_DeploymentEvent{
   715  							DeploymentEvent: &api.DeploymentEvent{
   716  								Application:       "app",
   717  								TargetEnvironment: "staging-1",
   718  								ReleaseTrainSource: &api.DeploymentEvent_ReleaseTrainSource{
   719  									UpstreamEnvironment:    "development-1",
   720  									TargetEnvironmentGroup: ptr.FromString("staging"),
   721  								},
   722  							},
   723  						},
   724  					},
   725  				},
   726  			},
   727  		},
   728  	}
   729  
   730  	for _, tc := range tcs {
   731  		tc := tc
   732  		t.Run(tc.name, func(t *testing.T) {
   733  			shutdown := make(chan struct{}, 1)
   734  			repo, err := setupRepositoryTest(t)
   735  			if err != nil {
   736  				t.Fatalf("error setting up repository test: %v", err)
   737  			}
   738  			ctx := rp.AddGeneratorToContext(testutil.MakeTestContext(), testutil.NewIncrementalUUIDGenerator())
   739  
   740  			for _, transformer := range environmentSetup {
   741  				err := repo.Apply(ctx, transformer)
   742  				if err != nil {
   743  					t.Fatalf("expected no error in transformer but got:\n%v\n", err)
   744  				}
   745  			}
   746  			for _, transformer := range tc.transformers {
   747  				err := repo.Apply(ctx, transformer)
   748  				if err != nil {
   749  					t.Fatalf("expected no error in transformer but got:\n%v\n", err)
   750  				}
   751  			}
   752  
   753  			config := rp.RepositoryConfig{
   754  				WriteCommitData: tc.allowReadingCommitData,
   755  			}
   756  			sv := &GitServer{
   757  				OverviewService: &OverviewServiceServer{Repository: repo, Shutdown: shutdown},
   758  				Config:          config,
   759  			}
   760  
   761  			commitInfo, err := sv.GetCommitInfo(ctx, tc.request)
   762  
   763  			if diff := cmp.Diff(tc.expectedError, err, cmpopts.EquateErrors()); diff != "" {
   764  				t.Errorf("error mismatch (-want, +got):\n%s", diff)
   765  			}
   766  
   767  			if commitInfo != nil {
   768  				sort.Slice(commitInfo.Events, func(i, j int) bool {
   769  					return commitInfo.Events[i].Uuid < commitInfo.Events[j].Uuid
   770  				})
   771  				for _, event := range commitInfo.Events {
   772  					if createReleaseEvent, ok := event.EventType.(*api.Event_CreateReleaseEvent); ok {
   773  						sort.Strings(createReleaseEvent.CreateReleaseEvent.EnvironmentNames)
   774  					}
   775  				}
   776  			}
   777  
   778  			if diff := cmp.Diff(tc.expectedResponse, commitInfo, protocmp.Transform()); diff != "" {
   779  				t.Errorf("response mismatch (-want, +got):\n%s", diff)
   780  			}
   781  		})
   782  	}
   783  }