github.com/Foodji/aws-lambda-go@v1.20.2/events/codebuild_test.go (about)

     1  package events
     2  
     3  import (
     4  	"encoding/json"
     5  	"io/ioutil"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/stretchr/testify/require"
    10  )
    11  
    12  func TestUnmarshalCodeBuildEvent(t *testing.T) {
    13  	tests := []struct {
    14  		input  string
    15  		expect CodeBuildEvent
    16  	}{
    17  		{
    18  			input: "testdata/codebuild-state-change.json",
    19  			expect: CodeBuildEvent{
    20  				Version:    "0",
    21  				ID:         "c030038d-8c4d-6141-9545-00ff7b7153EX",
    22  				DetailType: CodeBuildStateChangeDetailType,
    23  				Source:     CodeBuildEventSource,
    24  				AccountID:  "123456789012",
    25  				Time:       time.Date(2017, 9, 1, 16, 14, 28, 0, time.UTC),
    26  				Region:     "us-west-2",
    27  				Resources: []string{
    28  					"arn:aws:codebuild:us-west-2:123456789012:build/my-sample-project:8745a7a9-c340-456a-9166-edf953571bEX",
    29  				},
    30  				Detail: CodeBuildEventDetail{
    31  					BuildStatus: CodeBuildPhaseStatusSucceeded,
    32  					ProjectName: "my-sample-project",
    33  					BuildID:     "arn:aws:codebuild:us-west-2:123456789012:build/my-sample-project:8745a7a9-c340-456a-9166-edf953571bEX",
    34  					AdditionalInformation: CodeBuildEventAdditionalInformation{
    35  						Artifact: CodeBuildArtifact{
    36  							MD5Sum:    "da9c44c8a9a3cd4b443126e823168fEX",
    37  							SHA256Sum: "6ccc2ae1df9d155ba83c597051611c42d60e09c6329dcb14a312cecc0a8e39EX",
    38  							Location:  "arn:aws:s3:::codebuild-123456789012-output-bucket/my-output-artifact.zip",
    39  						},
    40  						Environment: CodeBuildEnvironment{
    41  							Image:          "aws/codebuild/standard:2.0",
    42  							PrivilegedMode: false,
    43  							ComputeType:    "BUILD_GENERAL1_SMALL",
    44  							Type:           "LINUX_CONTAINER",
    45  							EnvironmentVariables: []CodeBuildEnvironmentVariable{
    46  								{
    47  									Name:  "TEST",
    48  									Type:  "PLAINTEXT",
    49  									Value: "TEST",
    50  								},
    51  							},
    52  						},
    53  						Timeout:        DurationMinutes(60 * time.Minute),
    54  						BuildComplete:  true,
    55  						Initiator:      "MyCodeBuildDemoUser",
    56  						BuildStartTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 12, 29, 0, time.UTC)),
    57  						Source: CodeBuildSource{
    58  							Location: "codebuild-123456789012-input-bucket/my-input-artifact.zip",
    59  							Type:     "S3",
    60  						},
    61  						Logs: CodeBuildLogs{
    62  							GroupName:  "/aws/codebuild/my-sample-project",
    63  							StreamName: "8745a7a9-c340-456a-9166-edf953571bEX",
    64  							DeepLink:   "https://console.aws.amazon.com/cloudwatch/home?region=us-west-2#logEvent:group=/aws/codebuild/my-sample-project;stream=8745a7a9-c340-456a-9166-edf953571bEX",
    65  						},
    66  						Phases: []CodeBuildPhase{
    67  							{
    68  								PhaseContext: []interface{}{},
    69  								StartTime:    CodeBuildTime(time.Date(2017, 9, 1, 16, 12, 29, 0, time.UTC)),
    70  								EndTime:      CodeBuildTime(time.Date(2017, 9, 1, 16, 12, 29, 0, time.UTC)),
    71  								Duration:     DurationSeconds(0),
    72  								PhaseType:    CodeBuildPhaseTypeSubmitted,
    73  								PhaseStatus:  CodeBuildPhaseStatusSucceeded,
    74  							},
    75  							{
    76  								PhaseContext: []interface{}{},
    77  								StartTime:    CodeBuildTime(time.Date(2017, 9, 1, 16, 12, 29, 0, time.UTC)),
    78  								EndTime:      CodeBuildTime(time.Date(2019, 9, 13, 4, 12, 29, 0, time.UTC)),
    79  								Duration:     DurationSeconds(0),
    80  								PhaseType:    CodeBuildPhaseTypeQueued,
    81  								PhaseStatus:  CodeBuildPhaseStatusSucceeded,
    82  							},
    83  							{
    84  								PhaseContext: []interface{}{},
    85  								StartTime:    CodeBuildTime(time.Date(2017, 9, 1, 16, 12, 29, 0, time.UTC)),
    86  								EndTime:      CodeBuildTime(time.Date(2017, 9, 1, 16, 13, 05, 0, time.UTC)),
    87  								Duration:     DurationSeconds(36 * time.Second),
    88  								PhaseType:    CodeBuildPhaseTypeProvisioning,
    89  								PhaseStatus:  CodeBuildPhaseStatusSucceeded,
    90  							},
    91  							{
    92  								PhaseContext: []interface{}{},
    93  								StartTime:    CodeBuildTime(time.Date(2017, 9, 1, 16, 13, 5, 0, time.UTC)),
    94  								EndTime:      CodeBuildTime(time.Date(2017, 9, 1, 16, 13, 10, 0, time.UTC)),
    95  								Duration:     DurationSeconds(4 * time.Second),
    96  								PhaseType:    CodeBuildPhaseTypeDownloadSource,
    97  								PhaseStatus:  CodeBuildPhaseStatusSucceeded,
    98  							},
    99  							{
   100  								PhaseContext: []interface{}{},
   101  								StartTime:    CodeBuildTime(time.Date(2017, 9, 1, 16, 13, 10, 0, time.UTC)),
   102  								EndTime:      CodeBuildTime(time.Date(2017, 9, 1, 16, 13, 10, 0, time.UTC)),
   103  								Duration:     DurationSeconds(0),
   104  								PhaseType:    CodeBuildPhaseTypeInstall,
   105  								PhaseStatus:  CodeBuildPhaseStatusSucceeded,
   106  							},
   107  							{
   108  								PhaseContext: []interface{}{},
   109  								StartTime:    CodeBuildTime(time.Date(2017, 9, 1, 16, 13, 10, 0, time.UTC)),
   110  								EndTime:      CodeBuildTime(time.Date(2017, 9, 1, 16, 13, 10, 0, time.UTC)),
   111  								Duration:     DurationSeconds(0),
   112  								PhaseType:    CodeBuildPhaseTypePreBuild,
   113  								PhaseStatus:  CodeBuildPhaseStatusSucceeded,
   114  							},
   115  							{
   116  								PhaseContext: []interface{}{},
   117  								StartTime:    CodeBuildTime(time.Date(2017, 9, 1, 16, 13, 10, 0, time.UTC)),
   118  								EndTime:      CodeBuildTime(time.Date(2017, 9, 1, 16, 14, 21, 0, time.UTC)),
   119  								Duration:     DurationSeconds(70 * time.Second),
   120  								PhaseType:    CodeBuildPhaseTypeBuild,
   121  								PhaseStatus:  CodeBuildPhaseStatusSucceeded,
   122  							},
   123  							{
   124  								PhaseContext: []interface{}{},
   125  								StartTime:    CodeBuildTime(time.Date(2017, 9, 1, 16, 14, 21, 0, time.UTC)),
   126  								EndTime:      CodeBuildTime(time.Date(2017, 9, 1, 16, 14, 21, 0, time.UTC)),
   127  								Duration:     DurationSeconds(0),
   128  								PhaseType:    CodeBuildPhaseTypePostBuild,
   129  								PhaseStatus:  CodeBuildPhaseStatusSucceeded,
   130  							},
   131  							{
   132  								PhaseContext: []interface{}{},
   133  								StartTime:    CodeBuildTime(time.Date(2017, 9, 1, 16, 14, 21, 0, time.UTC)),
   134  								EndTime:      CodeBuildTime(time.Date(2017, 9, 1, 16, 14, 21, 0, time.UTC)),
   135  								Duration:     DurationSeconds(0),
   136  								PhaseType:    CodeBuildPhaseTypeUploadArtifacts,
   137  								PhaseStatus:  CodeBuildPhaseStatusSucceeded,
   138  							},
   139  							{
   140  								PhaseContext: []interface{}{},
   141  								StartTime:    CodeBuildTime(time.Date(2017, 9, 1, 16, 14, 21, 0, time.UTC)),
   142  								EndTime:      CodeBuildTime(time.Date(2017, 9, 1, 16, 14, 26, 0, time.UTC)),
   143  								Duration:     DurationSeconds(4 * time.Second),
   144  								PhaseType:    CodeBuildPhaseTypeFinalizing,
   145  								PhaseStatus:  CodeBuildPhaseStatusSucceeded,
   146  							},
   147  							{
   148  								StartTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 14, 26, 0, time.UTC)),
   149  								PhaseType: CodeBuildPhaseTypeCompleted,
   150  							},
   151  						},
   152  					},
   153  					CurrentPhase:        CodeBuildPhaseTypeCompleted,
   154  					CurrentPhaseContext: "[]",
   155  					Version:             "1",
   156  				},
   157  			},
   158  		},
   159  		{
   160  			input: "testdata/codebuild-phase-change.json",
   161  			expect: CodeBuildEvent{
   162  				Version:    "0",
   163  				ID:         "43ddc2bd-af76-9ca5-2dc7-b695e15adeEX",
   164  				DetailType: CodeBuildPhaseChangeDetailType,
   165  				Source:     CodeBuildEventSource,
   166  				AccountID:  "123456789012",
   167  				Time:       time.Date(2017, 9, 1, 16, 14, 21, 0, time.UTC),
   168  				Region:     "us-west-2",
   169  				Resources: []string{
   170  					"arn:aws:codebuild:us-west-2:123456789012:build/my-sample-project:8745a7a9-c340-456a-9166-edf953571bEX",
   171  				},
   172  				Detail: CodeBuildEventDetail{
   173  					CompletedPhase:        CodeBuildPhaseTypeCompleted,
   174  					ProjectName:           "my-sample-project",
   175  					BuildID:               "arn:aws:codebuild:us-west-2:123456789012:build/my-sample-project:8745a7a9-c340-456a-9166-edf953571bEX",
   176  					CompletedPhaseContext: "[]",
   177  					AdditionalInformation: CodeBuildEventAdditionalInformation{
   178  						Artifact: CodeBuildArtifact{
   179  							MD5Sum:    "da9c44c8a9a3cd4b443126e823168fEX",
   180  							SHA256Sum: "6ccc2ae1df9d155ba83c597051611c42d60e09c6329dcb14a312cecc0a8e39EX",
   181  							Location:  "arn:aws:s3:::codebuild-123456789012-output-bucket/my-output-artifact.zip",
   182  						},
   183  						Environment: CodeBuildEnvironment{
   184  							Image:                "aws/codebuild/standard:2.0",
   185  							PrivilegedMode:       false,
   186  							ComputeType:          "BUILD_GENERAL1_SMALL",
   187  							Type:                 "LINUX_CONTAINER",
   188  							EnvironmentVariables: []CodeBuildEnvironmentVariable{},
   189  						},
   190  						Timeout:        DurationMinutes(60 * time.Minute),
   191  						BuildComplete:  true,
   192  						Initiator:      "MyCodeBuildDemoUser",
   193  						BuildStartTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 12, 29, 0, time.UTC)),
   194  						Source: CodeBuildSource{
   195  							Location: "codebuild-123456789012-input-bucket/my-input-artifact.zip",
   196  							Type:     "S3",
   197  						},
   198  						Logs: CodeBuildLogs{
   199  							GroupName:  "/aws/codebuild/my-sample-project",
   200  							StreamName: "8745a7a9-c340-456a-9166-edf953571bEX",
   201  							DeepLink:   "https://console.aws.amazon.com/cloudwatch/home?region=us-west-2#logEvent:group=/aws/codebuild/my-sample-project;stream=8745a7a9-c340-456a-9166-edf953571bEX",
   202  						},
   203  						Phases: []CodeBuildPhase{
   204  							{
   205  								PhaseContext: []interface{}{},
   206  								StartTime:    CodeBuildTime(time.Date(2017, 9, 1, 16, 12, 29, 0, time.UTC)),
   207  								EndTime:      CodeBuildTime(time.Date(2017, 9, 1, 16, 12, 29, 0, time.UTC)),
   208  								Duration:     DurationSeconds(0),
   209  								PhaseType:    CodeBuildPhaseTypeSubmitted,
   210  								PhaseStatus:  CodeBuildPhaseStatusSucceeded,
   211  							},
   212  							{
   213  								PhaseContext: []interface{}{},
   214  								StartTime:    CodeBuildTime(time.Date(2017, 9, 1, 16, 12, 29, 0, time.UTC)),
   215  								EndTime:      CodeBuildTime(time.Date(2019, 9, 13, 4, 12, 29, 0, time.UTC)),
   216  								Duration:     DurationSeconds(0),
   217  								PhaseType:    CodeBuildPhaseTypeQueued,
   218  								PhaseStatus:  CodeBuildPhaseStatusSucceeded,
   219  							},
   220  							{
   221  								PhaseContext: []interface{}{},
   222  								StartTime:    CodeBuildTime(time.Date(2017, 9, 1, 16, 12, 29, 0, time.UTC)),
   223  								EndTime:      CodeBuildTime(time.Date(2017, 9, 1, 16, 13, 05, 0, time.UTC)),
   224  								Duration:     DurationSeconds(36 * time.Second),
   225  								PhaseType:    CodeBuildPhaseTypeProvisioning,
   226  								PhaseStatus:  CodeBuildPhaseStatusSucceeded,
   227  							},
   228  							{
   229  								PhaseContext: []interface{}{},
   230  								StartTime:    CodeBuildTime(time.Date(2017, 9, 1, 16, 13, 5, 0, time.UTC)),
   231  								EndTime:      CodeBuildTime(time.Date(2017, 9, 1, 16, 13, 10, 0, time.UTC)),
   232  								Duration:     DurationSeconds(4 * time.Second),
   233  								PhaseType:    CodeBuildPhaseTypeDownloadSource,
   234  								PhaseStatus:  CodeBuildPhaseStatusSucceeded,
   235  							},
   236  							{
   237  								PhaseContext: []interface{}{},
   238  								StartTime:    CodeBuildTime(time.Date(2017, 9, 1, 16, 13, 10, 0, time.UTC)),
   239  								EndTime:      CodeBuildTime(time.Date(2017, 9, 1, 16, 13, 10, 0, time.UTC)),
   240  								Duration:     DurationSeconds(0),
   241  								PhaseType:    CodeBuildPhaseTypeInstall,
   242  								PhaseStatus:  CodeBuildPhaseStatusSucceeded,
   243  							},
   244  							{
   245  								PhaseContext: []interface{}{},
   246  								StartTime:    CodeBuildTime(time.Date(2017, 9, 1, 16, 13, 10, 0, time.UTC)),
   247  								EndTime:      CodeBuildTime(time.Date(2017, 9, 1, 16, 13, 10, 0, time.UTC)),
   248  								Duration:     DurationSeconds(0),
   249  								PhaseType:    CodeBuildPhaseTypePreBuild,
   250  								PhaseStatus:  CodeBuildPhaseStatusSucceeded,
   251  							},
   252  							{
   253  								PhaseContext: []interface{}{},
   254  								StartTime:    CodeBuildTime(time.Date(2017, 9, 1, 16, 13, 10, 0, time.UTC)),
   255  								EndTime:      CodeBuildTime(time.Date(2017, 9, 1, 16, 14, 21, 0, time.UTC)),
   256  								Duration:     DurationSeconds(70 * time.Second),
   257  								PhaseType:    CodeBuildPhaseTypeBuild,
   258  								PhaseStatus:  CodeBuildPhaseStatusSucceeded,
   259  							},
   260  							{
   261  								PhaseContext: []interface{}{},
   262  								StartTime:    CodeBuildTime(time.Date(2017, 9, 1, 16, 14, 21, 0, time.UTC)),
   263  								EndTime:      CodeBuildTime(time.Date(2017, 9, 1, 16, 14, 21, 0, time.UTC)),
   264  								Duration:     DurationSeconds(0),
   265  								PhaseType:    CodeBuildPhaseTypePostBuild,
   266  								PhaseStatus:  CodeBuildPhaseStatusSucceeded,
   267  							},
   268  							{
   269  								PhaseContext: []interface{}{},
   270  								StartTime:    CodeBuildTime(time.Date(2017, 9, 1, 16, 14, 21, 0, time.UTC)),
   271  								EndTime:      CodeBuildTime(time.Date(2017, 9, 1, 16, 14, 21, 0, time.UTC)),
   272  								Duration:     DurationSeconds(0),
   273  								PhaseType:    CodeBuildPhaseTypeUploadArtifacts,
   274  								PhaseStatus:  CodeBuildPhaseStatusSucceeded,
   275  							},
   276  							{
   277  								PhaseContext: []interface{}{},
   278  								StartTime:    CodeBuildTime(time.Date(2017, 9, 1, 16, 14, 21, 0, time.UTC)),
   279  								EndTime:      CodeBuildTime(time.Date(2017, 9, 1, 16, 14, 26, 0, time.UTC)),
   280  								Duration:     DurationSeconds(4 * time.Second),
   281  								PhaseType:    CodeBuildPhaseTypeFinalizing,
   282  								PhaseStatus:  CodeBuildPhaseStatusSucceeded,
   283  							},
   284  							{
   285  								StartTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 14, 26, 0, time.UTC)),
   286  								PhaseType: CodeBuildPhaseTypeCompleted,
   287  							},
   288  						},
   289  					},
   290  					CompletedPhaseStatus:   CodeBuildPhaseStatusSucceeded,
   291  					CompletedPhaseDuration: DurationSeconds(4 * time.Second),
   292  					Version:                "1",
   293  					CompletedPhaseStart:    CodeBuildTime(time.Date(2017, 9, 1, 16, 14, 21, 0, time.UTC)),
   294  					CompletedPhaseEnd:      CodeBuildTime(time.Date(2017, 9, 1, 16, 14, 26, 0, time.UTC)),
   295  				},
   296  			},
   297  		},
   298  	}
   299  
   300  	for _, testcase := range tests {
   301  		data, err := ioutil.ReadFile(testcase.input)
   302  		require.NoError(t, err)
   303  
   304  		var actual CodeBuildEvent
   305  		require.NoError(t, json.Unmarshal(data, &actual))
   306  
   307  		require.Equal(t, testcase.expect, actual)
   308  	}
   309  }