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 }