// FillMissingDefaults ... func (step *StepModel) FillMissingDefaults() error { if step.Title == nil { step.Title = pointers.NewStringPtr("") } if step.Description == nil { step.Description = pointers.NewStringPtr("") } if step.Summary == nil { step.Summary = pointers.NewStringPtr("") } if step.Website == nil { step.Website = pointers.NewStringPtr("") } if step.SourceCodeURL == nil { step.SourceCodeURL = pointers.NewStringPtr("") } if step.SupportURL == nil { step.SupportURL = pointers.NewStringPtr("") } if step.IsRequiresAdminUser == nil { step.IsRequiresAdminUser = pointers.NewBoolPtr(DefaultIsRequiresAdminUser) } if step.IsAlwaysRun == nil { step.IsAlwaysRun = pointers.NewBoolPtr(DefaultIsAlwaysRun) } if step.IsSkippable == nil { step.IsSkippable = pointers.NewBoolPtr(DefaultIsSkippable) } if step.RunIf == nil { step.RunIf = pointers.NewStringPtr("") } if step.Timeout == nil { step.Timeout = pointers.NewIntPtr(DefaultTimeout) } for _, input := range step.Inputs { err := input.FillMissingDefaults() if err != nil { return err } } for _, output := range step.Outputs { err := output.FillMissingDefaults() if err != nil { return err } } return nil }
func TestMergeStepWith(t *testing.T) { desc := "desc 1" summ := "sum 1" website := "web/1" fork := "fork/1" published := time.Date(2012, time.January, 1, 0, 0, 0, 0, time.UTC) stepData := stepmanModels.StepModel{ Description: pointers.NewStringPtr(desc), Summary: pointers.NewStringPtr(summ), Website: pointers.NewStringPtr(website), SourceCodeURL: pointers.NewStringPtr(fork), PublishedAt: pointers.NewTimePtr(published), HostOsTags: []string{"osx"}, ProjectTypeTags: []string{"ios"}, TypeTags: []string{"test"}, IsRequiresAdminUser: pointers.NewBoolPtr(true), Inputs: []envmanModels.EnvironmentItemModel{ envmanModels.EnvironmentItemModel{ "KEY_1": "Value 1", }, envmanModels.EnvironmentItemModel{ "KEY_2": "Value 2", }, }, Outputs: []envmanModels.EnvironmentItemModel{}, } diffTitle := "name 2" newSuppURL := "supp" runIfStr := "" stepDiffToMerge := stepmanModels.StepModel{ Title: pointers.NewStringPtr(diffTitle), HostOsTags: []string{"linux"}, Source: &stepmanModels.StepSourceModel{ Git: "https://git.url", }, Dependencies: []stepmanModels.DependencyModel{ stepmanModels.DependencyModel{ Manager: "brew", Name: "test", }, }, SupportURL: pointers.NewStringPtr(newSuppURL), RunIf: pointers.NewStringPtr(runIfStr), Inputs: []envmanModels.EnvironmentItemModel{ envmanModels.EnvironmentItemModel{ "KEY_2": "Value 2 CHANGED", }, }, Timeout: pointers.NewIntPtr(1), Toolkit: &stepmanModels.StepToolkitModel{ Go: &stepmanModels.GoStepToolkitModel{ PackageName: "test", }, }, } mergedStepData, err := MergeStepWith(stepData, stepDiffToMerge) require.NoError(t, err) require.Equal(t, "name 2", *mergedStepData.Title) require.Equal(t, "desc 1", *mergedStepData.Description) require.Equal(t, "sum 1", *mergedStepData.Summary) require.Equal(t, "web/1", *mergedStepData.Website) require.Equal(t, "fork/1", *mergedStepData.SourceCodeURL) require.Equal(t, true, (*mergedStepData.PublishedAt).Equal(time.Date(2012, time.January, 1, 0, 0, 0, 0, time.UTC))) require.Equal(t, "linux", mergedStepData.HostOsTags[0]) require.Equal(t, "", *mergedStepData.RunIf) require.Equal(t, 1, len(mergedStepData.Dependencies)) require.Equal(t, "test", mergedStepData.Toolkit.Go.PackageName) require.Equal(t, 1, *mergedStepData.Timeout) dep := mergedStepData.Dependencies[0] require.Equal(t, "brew", dep.Manager) require.Equal(t, "test", dep.Name) // inputs input0 := mergedStepData.Inputs[0] key0, value0, err := input0.GetKeyValuePair() require.NoError(t, err) require.Equal(t, "KEY_1", key0) require.Equal(t, "Value 1", value0) input1 := mergedStepData.Inputs[1] key1, value1, err := input1.GetKeyValuePair() require.NoError(t, err) require.Equal(t, "KEY_2", key1) require.Equal(t, "Value 2 CHANGED", value1) }
func Test_HookProvider_TransformRequest(t *testing.T) { provider := HookProvider{} t.Log("Ping - should be skipped") { request := http.Request{ Header: http.Header{ "Content-Type": {"application/json"}, "X-Github-Event": {"ping"}, }, } hookTransformResult := provider.TransformRequest(&request) require.True(t, hookTransformResult.ShouldSkip) require.EqualError(t, hookTransformResult.Error, "Ping event received") } t.Log("Unsuported Content-Type") { request := http.Request{ Header: http.Header{ "Content-Type": {"not/supported"}, "X-Github-Event": {"ping"}, }, } hookTransformResult := provider.TransformRequest(&request) require.False(t, hookTransformResult.ShouldSkip) require.EqualError(t, hookTransformResult.Error, "Content-Type is not supported: not/supported") } t.Log("Unsupported event type - should error") { request := http.Request{ Header: http.Header{ "Content-Type": {"application/json"}, "X-Github-Event": {"label"}, }, } hookTransformResult := provider.TransformRequest(&request) require.False(t, hookTransformResult.ShouldSkip) require.EqualError(t, hookTransformResult.Error, "Unsupported GitHub Webhook event: label") } t.Log("Push Event - should not be skipped") { request := http.Request{ Header: http.Header{ "Content-Type": {"application/json"}, "X-Github-Event": {"push"}, }, } hookTransformResult := provider.TransformRequest(&request) require.False(t, hookTransformResult.ShouldSkip) require.EqualError(t, hookTransformResult.Error, "Failed to read content of request body: no or empty request body") } t.Log("Pull Request Event - should not be skipped") { request := http.Request{ Header: http.Header{ "Content-Type": {"application/json"}, "X-Github-Event": {"pull_request"}, }, } hookTransformResult := provider.TransformRequest(&request) require.False(t, hookTransformResult.ShouldSkip) require.EqualError(t, hookTransformResult.Error, "Failed to read content of request body: no or empty request body") } t.Log("No Request Body") { request := http.Request{ Header: http.Header{ "Content-Type": {"application/json"}, "X-Github-Event": {"push"}, }, } hookTransformResult := provider.TransformRequest(&request) require.False(t, hookTransformResult.ShouldSkip) require.EqualError(t, hookTransformResult.Error, "Failed to read content of request body: no or empty request body") } t.Log("Code Push - should be handled") { request := http.Request{ Header: http.Header{ "X-Github-Event": {"push"}, "Content-Type": {"application/json"}, }, Body: ioutil.NopCloser(strings.NewReader(sampleCodePushData)), } hookTransformResult := provider.TransformRequest(&request) require.NoError(t, hookTransformResult.Error) require.False(t, hookTransformResult.ShouldSkip) require.Equal(t, []bitriseapi.TriggerAPIParamsModel{ { BuildParams: bitriseapi.BuildParamsModel{ CommitHash: "83b86e5f286f546dc5a4a58db66ceef44460c85e", CommitMessage: "re-structuring Hook Providers, with added tests", Branch: "master", }, }, }, hookTransformResult.TriggerAPIParams) } t.Log("Tag Push - should be handled") { request := http.Request{ Header: http.Header{ "X-Github-Event": {"push"}, "Content-Type": {"application/json"}, }, Body: ioutil.NopCloser(strings.NewReader(sampleTagPushData)), } hookTransformResult := provider.TransformRequest(&request) require.NoError(t, hookTransformResult.Error) require.False(t, hookTransformResult.ShouldSkip) require.Equal(t, []bitriseapi.TriggerAPIParamsModel{ { BuildParams: bitriseapi.BuildParamsModel{ Tag: "v0.0.2", CommitHash: "2e197ebd2330183ae11338151cf3a75db0c23c92", CommitMessage: "generalize Push Event (previously Code Push)\n\nwe'll handle the Tag Push too, so related codes are changed to reflect this (removed code from CodePush - e.g. CodePushEventModel -> PushEventModel)", }, }, }, hookTransformResult.TriggerAPIParams) } t.Log("Pull Request - should be handled") { request := http.Request{ Header: http.Header{ "X-Github-Event": {"pull_request"}, "Content-Type": {"application/json"}, }, Body: ioutil.NopCloser(strings.NewReader(samplePullRequestData)), } hookTransformResult := provider.TransformRequest(&request) require.NoError(t, hookTransformResult.Error) require.False(t, hookTransformResult.ShouldSkip) require.Equal(t, []bitriseapi.TriggerAPIParamsModel{ { BuildParams: bitriseapi.BuildParamsModel{ CommitHash: "83b86e5f286f546dc5a4a58db66ceef44460c85e", CommitMessage: "PR test\n\nPR text body", Branch: "feature/github-pr", BranchDest: "master", PullRequestID: pointers.NewIntPtr(12), PullRequestRepositoryURL: "https://github.com/bitrise-io/bitrise-webhooks.git", PullRequestMergeBranch: "pull/12/merge", }, }, }, hookTransformResult.TriggerAPIParams) } t.Log("Pull Request :: edited - should be handled") { request := http.Request{ Header: http.Header{ "X-Github-Event": {"pull_request"}, "Content-Type": {"application/json"}, }, Body: ioutil.NopCloser(strings.NewReader(samplePullRequestEditedData)), } hookTransformResult := provider.TransformRequest(&request) require.NoError(t, hookTransformResult.Error) require.False(t, hookTransformResult.ShouldSkip) require.Equal(t, []bitriseapi.TriggerAPIParamsModel{ { BuildParams: bitriseapi.BuildParamsModel{ CommitHash: "83b86e5f286f546dc5a4a58db66ceef44460c85e", CommitMessage: "PR test\n\nPR text body", Branch: "feature/github-pr", BranchDest: "develop", PullRequestID: pointers.NewIntPtr(12), PullRequestRepositoryURL: "https://github.com/bitrise-io/bitrise-webhooks.git", PullRequestMergeBranch: "pull/12/merge", }, }, }, hookTransformResult.TriggerAPIParams) } }
func Test_transformPullRequestEvent(t *testing.T) { t.Log("Unsupported Pull Request action") { pullRequest := PullRequestEventModel{ Action: "labeled", } hookTransformResult := transformPullRequestEvent(pullRequest) require.True(t, hookTransformResult.ShouldSkip) require.EqualError(t, hookTransformResult.Error, "Pull Request action doesn't require a build: labeled") } t.Log("Empty Pull Request action") { pullRequest := PullRequestEventModel{} hookTransformResult := transformPullRequestEvent(pullRequest) require.True(t, hookTransformResult.ShouldSkip) require.EqualError(t, hookTransformResult.Error, "No Pull Request action specified") } t.Log("Already Merged") { pullRequest := PullRequestEventModel{ Action: "opened", PullRequestInfo: PullRequestInfoModel{ Merged: true, }, } hookTransformResult := transformPullRequestEvent(pullRequest) require.True(t, hookTransformResult.ShouldSkip) require.EqualError(t, hookTransformResult.Error, "Pull Request already merged") } t.Log("Not Mergeable") { pullRequest := PullRequestEventModel{ Action: "reopened", PullRequestInfo: PullRequestInfoModel{ Merged: false, Mergeable: pointers.NewBoolPtr(false), }, } hookTransformResult := transformPullRequestEvent(pullRequest) require.True(t, hookTransformResult.ShouldSkip) require.EqualError(t, hookTransformResult.Error, "Pull Request is not mergeable") } t.Log("Mergeable: not yet decided") { pullRequest := PullRequestEventModel{ Action: "synchronize", PullRequestID: 12, PullRequestInfo: PullRequestInfoModel{ Title: "PR test", Merged: false, Mergeable: nil, HeadBranchInfo: BranchInfoModel{ Ref: "feature/github-pr", CommitHash: "83b86e5f286f546dc5a4a58db66ceef44460c85e", Repo: RepoInfoModel{ Private: false, SSHURL: "[email protected]:bitrise-io/bitrise-webhooks.git", CloneURL: "https://github.com/bitrise-io/bitrise-webhooks.git", }, }, BaseBranchInfo: BranchInfoModel{ Ref: "master", CommitHash: "3c86b996d8014000a93f3c202fc0963e81e56c4c", Repo: RepoInfoModel{ Private: false, SSHURL: "[email protected]:bitrise-io/bitrise-webhooks.git", CloneURL: "https://github.com/bitrise-io/bitrise-webhooks.git", }, }, }, } hookTransformResult := transformPullRequestEvent(pullRequest) require.False(t, hookTransformResult.ShouldSkip) require.NoError(t, hookTransformResult.Error) require.Equal(t, []bitriseapi.TriggerAPIParamsModel{ { BuildParams: bitriseapi.BuildParamsModel{ CommitHash: "83b86e5f286f546dc5a4a58db66ceef44460c85e", CommitMessage: "PR test", Branch: "feature/github-pr", BranchDest: "master", PullRequestID: pointers.NewIntPtr(12), PullRequestRepositoryURL: "https://github.com/bitrise-io/bitrise-webhooks.git", PullRequestMergeBranch: "pull/12/merge", }, }, }, hookTransformResult.TriggerAPIParams) } t.Log("Mergeable: true") { pullRequest := PullRequestEventModel{ Action: "synchronize", PullRequestID: 12, PullRequestInfo: PullRequestInfoModel{ Title: "PR test", Merged: false, Mergeable: pointers.NewBoolPtr(true), HeadBranchInfo: BranchInfoModel{ Ref: "feature/github-pr", CommitHash: "83b86e5f286f546dc5a4a58db66ceef44460c85e", Repo: RepoInfoModel{ Private: false, SSHURL: "[email protected]:bitrise-io/bitrise-webhooks.git", CloneURL: "https://github.com/bitrise-io/bitrise-webhooks.git", }, }, BaseBranchInfo: BranchInfoModel{ Ref: "master", CommitHash: "3c86b996d8014000a93f3c202fc0963e81e56c4c", Repo: RepoInfoModel{ Private: false, SSHURL: "[email protected]:bitrise-io/bitrise-webhooks.git", CloneURL: "https://github.com/bitrise-io/bitrise-webhooks.git", }, }, }, } hookTransformResult := transformPullRequestEvent(pullRequest) require.NoError(t, hookTransformResult.Error) require.False(t, hookTransformResult.ShouldSkip) require.Equal(t, []bitriseapi.TriggerAPIParamsModel{ { BuildParams: bitriseapi.BuildParamsModel{ CommitHash: "83b86e5f286f546dc5a4a58db66ceef44460c85e", CommitMessage: "PR test", Branch: "feature/github-pr", BranchDest: "master", PullRequestID: pointers.NewIntPtr(12), PullRequestRepositoryURL: "https://github.com/bitrise-io/bitrise-webhooks.git", PullRequestMergeBranch: "pull/12/merge", }, }, }, hookTransformResult.TriggerAPIParams) } t.Log("Pull Request - Title & Body") { pullRequest := PullRequestEventModel{ Action: "opened", PullRequestID: 12, PullRequestInfo: PullRequestInfoModel{ Title: "PR test", Body: "PR text body", Merged: false, Mergeable: pointers.NewBoolPtr(true), HeadBranchInfo: BranchInfoModel{ Ref: "feature/github-pr", CommitHash: "83b86e5f286f546dc5a4a58db66ceef44460c85e", Repo: RepoInfoModel{ Private: false, SSHURL: "[email protected]:bitrise-io/bitrise-webhooks.git", CloneURL: "https://github.com/bitrise-io/bitrise-webhooks.git", }, }, BaseBranchInfo: BranchInfoModel{ Ref: "master", CommitHash: "3c86b996d8014000a93f3c202fc0963e81e56c4c", Repo: RepoInfoModel{ Private: false, SSHURL: "[email protected]:bitrise-io/bitrise-webhooks.git", CloneURL: "https://github.com/bitrise-io/bitrise-webhooks.git", }, }, }, } hookTransformResult := transformPullRequestEvent(pullRequest) require.NoError(t, hookTransformResult.Error) require.False(t, hookTransformResult.ShouldSkip) require.Equal(t, []bitriseapi.TriggerAPIParamsModel{ { BuildParams: bitriseapi.BuildParamsModel{ CommitHash: "83b86e5f286f546dc5a4a58db66ceef44460c85e", CommitMessage: "PR test\n\nPR text body", Branch: "feature/github-pr", BranchDest: "master", PullRequestID: pointers.NewIntPtr(12), PullRequestRepositoryURL: "https://github.com/bitrise-io/bitrise-webhooks.git", PullRequestMergeBranch: "pull/12/merge", }, }, }, hookTransformResult.TriggerAPIParams) } t.Log("Pull Request - edited - only title change - no skip ci change - no build") { pullRequest := PullRequestEventModel{ Action: "edited", PullRequestID: 12, PullRequestInfo: PullRequestInfoModel{ Title: "PR test", Body: "PR text body", Merged: false, Mergeable: pointers.NewBoolPtr(true), HeadBranchInfo: BranchInfoModel{ Ref: "feature/github-pr", CommitHash: "83b86e5f286f546dc5a4a58db66ceef44460c85e", Repo: RepoInfoModel{ Private: false, SSHURL: "[email protected]:bitrise-io/bitrise-webhooks.git", CloneURL: "https://github.com/bitrise-io/bitrise-webhooks.git", }, }, BaseBranchInfo: BranchInfoModel{ Ref: "develop", CommitHash: "3c86b996d8014000a93f3c202fc0963e81e56c4c", Repo: RepoInfoModel{ Private: false, SSHURL: "[email protected]:bitrise-io/bitrise-webhooks.git", CloneURL: "https://github.com/bitrise-io/bitrise-webhooks.git", }, }, }, Changes: PullRequestChangesInfoModel{ Title: PullRequestChangeFromItemModel{ From: "previous title", }, }, } hookTransformResult := transformPullRequestEvent(pullRequest) require.EqualError(t, hookTransformResult.Error, "Pull Request edit doesn't require a build: only title and/or description was changed, and previous one was not skipped") require.True(t, hookTransformResult.ShouldSkip) require.Equal(t, []bitriseapi.TriggerAPIParamsModel(nil), hookTransformResult.TriggerAPIParams) } t.Log("Pull Request - edited - only title changed - BUT the previous title included a skip CI pattern - should build") { pullRequest := PullRequestEventModel{ Action: "edited", PullRequestID: 12, PullRequestInfo: PullRequestInfoModel{ Title: "PR test", Body: "PR text body", Merged: false, Mergeable: pointers.NewBoolPtr(true), HeadBranchInfo: BranchInfoModel{ Ref: "feature/github-pr", CommitHash: "83b86e5f286f546dc5a4a58db66ceef44460c85e", Repo: RepoInfoModel{ Private: false, SSHURL: "[email protected]:bitrise-io/bitrise-webhooks.git", CloneURL: "https://github.com/bitrise-io/bitrise-webhooks.git", }, }, BaseBranchInfo: BranchInfoModel{ Ref: "develop", CommitHash: "3c86b996d8014000a93f3c202fc0963e81e56c4c", Repo: RepoInfoModel{ Private: false, SSHURL: "[email protected]:bitrise-io/bitrise-webhooks.git", CloneURL: "https://github.com/bitrise-io/bitrise-webhooks.git", }, }, }, Changes: PullRequestChangesInfoModel{ Title: PullRequestChangeFromItemModel{ From: "previous title with [skip ci] in it", }, }, } hookTransformResult := transformPullRequestEvent(pullRequest) require.NoError(t, hookTransformResult.Error) require.False(t, hookTransformResult.ShouldSkip) require.Equal(t, []bitriseapi.TriggerAPIParamsModel{ { BuildParams: bitriseapi.BuildParamsModel{ CommitHash: "83b86e5f286f546dc5a4a58db66ceef44460c85e", CommitMessage: "PR test\n\nPR text body", Branch: "feature/github-pr", BranchDest: "develop", PullRequestID: pointers.NewIntPtr(12), PullRequestRepositoryURL: "https://github.com/bitrise-io/bitrise-webhooks.git", PullRequestMergeBranch: "pull/12/merge", }, }, }, hookTransformResult.TriggerAPIParams) } t.Log("Pull Request - edited - only body/description change - no skip ci in previous - no build") { pullRequest := PullRequestEventModel{ Action: "edited", PullRequestID: 12, PullRequestInfo: PullRequestInfoModel{ Title: "PR test", Body: "PR text body", Merged: false, Mergeable: pointers.NewBoolPtr(true), HeadBranchInfo: BranchInfoModel{ Ref: "feature/github-pr", CommitHash: "83b86e5f286f546dc5a4a58db66ceef44460c85e", Repo: RepoInfoModel{ Private: false, SSHURL: "[email protected]:bitrise-io/bitrise-webhooks.git", CloneURL: "https://github.com/bitrise-io/bitrise-webhooks.git", }, }, BaseBranchInfo: BranchInfoModel{ Ref: "develop", CommitHash: "3c86b996d8014000a93f3c202fc0963e81e56c4c", Repo: RepoInfoModel{ Private: false, SSHURL: "[email protected]:bitrise-io/bitrise-webhooks.git", CloneURL: "https://github.com/bitrise-io/bitrise-webhooks.git", }, }, }, Changes: PullRequestChangesInfoModel{ Body: PullRequestChangeFromItemModel{ From: "previous body", }, }, } hookTransformResult := transformPullRequestEvent(pullRequest) require.EqualError(t, hookTransformResult.Error, "Pull Request edit doesn't require a build: only title and/or description was changed, and previous one was not skipped") require.True(t, hookTransformResult.ShouldSkip) require.Equal(t, []bitriseapi.TriggerAPIParamsModel(nil), hookTransformResult.TriggerAPIParams) } t.Log("Pull Request - edited - only body/description change - BUT the previous title included a skip CI pattern - should build") { pullRequest := PullRequestEventModel{ Action: "edited", PullRequestID: 12, PullRequestInfo: PullRequestInfoModel{ Title: "PR test", Body: "PR text body", Merged: false, Mergeable: pointers.NewBoolPtr(true), HeadBranchInfo: BranchInfoModel{ Ref: "feature/github-pr", CommitHash: "83b86e5f286f546dc5a4a58db66ceef44460c85e", Repo: RepoInfoModel{ Private: false, SSHURL: "[email protected]:bitrise-io/bitrise-webhooks.git", CloneURL: "https://github.com/bitrise-io/bitrise-webhooks.git", }, }, BaseBranchInfo: BranchInfoModel{ Ref: "develop", CommitHash: "3c86b996d8014000a93f3c202fc0963e81e56c4c", Repo: RepoInfoModel{ Private: false, SSHURL: "[email protected]:bitrise-io/bitrise-webhooks.git", CloneURL: "https://github.com/bitrise-io/bitrise-webhooks.git", }, }, }, Changes: PullRequestChangesInfoModel{ Body: PullRequestChangeFromItemModel{ From: "previous body with [skip ci] in it", }, }, } hookTransformResult := transformPullRequestEvent(pullRequest) require.NoError(t, hookTransformResult.Error) require.False(t, hookTransformResult.ShouldSkip) require.Equal(t, []bitriseapi.TriggerAPIParamsModel{ { BuildParams: bitriseapi.BuildParamsModel{ CommitHash: "83b86e5f286f546dc5a4a58db66ceef44460c85e", CommitMessage: "PR test\n\nPR text body", Branch: "feature/github-pr", BranchDest: "develop", PullRequestID: pointers.NewIntPtr(12), PullRequestRepositoryURL: "https://github.com/bitrise-io/bitrise-webhooks.git", PullRequestMergeBranch: "pull/12/merge", }, }, }, hookTransformResult.TriggerAPIParams) } }
func Test_HookProvider_TransformRequest(t *testing.T) { provider := HookProvider{} t.Log("It's a re-try (X-Attempt-Number >= 2) - skip") { request := http.Request{ Header: http.Header{ "X-Event-Key": {"repo:push"}, "Content-Type": {"application/json"}, "X-Attempt-Number": {"2"}, }, } hookTransformResult := provider.TransformRequest(&request) require.EqualError(t, hookTransformResult.Error, "No retry is supported (X-Attempt-Number: 2)") require.False(t, hookTransformResult.ShouldSkip) require.Nil(t, hookTransformResult.TriggerAPIParams) } t.Log("Unsupported Event Type") { request := http.Request{ Header: http.Header{ "X-Event-Key": {"not:supported"}, "Content-Type": {"application/json"}, "X-Attempt-Number": {"1"}, }, } hookTransformResult := provider.TransformRequest(&request) require.False(t, hookTransformResult.ShouldSkip) require.EqualError(t, hookTransformResult.Error, "X-Event-Key is not supported: not:supported") } t.Log("Unsupported Content-Type") { request := http.Request{ Header: http.Header{ "X-Event-Key": {"repo:push"}, "Content-Type": {"not/supported"}, "X-Attempt-Number": {"1"}, }, } hookTransformResult := provider.TransformRequest(&request) require.False(t, hookTransformResult.ShouldSkip) require.EqualError(t, hookTransformResult.Error, "Content-Type is not supported: not/supported") } t.Log("No Request Body") { request := http.Request{ Header: http.Header{ "X-Event-Key": {"repo:push"}, "Content-Type": {"application/json"}, "X-Attempt-Number": {"1"}, }, } hookTransformResult := provider.TransformRequest(&request) require.False(t, hookTransformResult.ShouldSkip) require.EqualError(t, hookTransformResult.Error, "Failed to read content of request body: no or empty request body") } t.Log("Test with Sample Code Push data") { request := http.Request{ Header: http.Header{ "X-Event-Key": {"repo:push"}, "Content-Type": {"application/json"}, "X-Attempt-Number": {"1"}, }, Body: ioutil.NopCloser(strings.NewReader(sampleCodePushData)), } hookTransformResult := provider.TransformRequest(&request) require.NoError(t, hookTransformResult.Error) require.False(t, hookTransformResult.ShouldSkip) require.Equal(t, []bitriseapi.TriggerAPIParamsModel{ { BuildParams: bitriseapi.BuildParamsModel{ CommitHash: "966d0bfe79b80f97268c2f6bb45e65e79ef09b31", CommitMessage: "auto-test", Branch: "master", }, }, { BuildParams: bitriseapi.BuildParamsModel{ CommitHash: "19934139a2cf799bbd0f5061ab02e4760902e93f", CommitMessage: "auto-test 2", Branch: "test", }, }, }, hookTransformResult.TriggerAPIParams) } t.Log("Test with Sample Tag Push data") { request := http.Request{ Header: http.Header{ "X-Event-Key": {"repo:push"}, "Content-Type": {"application/json"}, "X-Attempt-Number": {"1"}, }, Body: ioutil.NopCloser(strings.NewReader(sampleTagPushData)), } hookTransformResult := provider.TransformRequest(&request) require.NoError(t, hookTransformResult.Error) require.False(t, hookTransformResult.ShouldSkip) require.Equal(t, []bitriseapi.TriggerAPIParamsModel{ { BuildParams: bitriseapi.BuildParamsModel{ Tag: "v0.0.2", CommitHash: "966d0bfe79b80f97268c2f6bb45e65e79ef09b31", CommitMessage: "auto-test", }, }, { BuildParams: bitriseapi.BuildParamsModel{ Tag: "v0.0.1", CommitHash: "19934139a2cf799bbd0f5061ab02e4760902e93f", CommitMessage: "auto-test 2", }, }, }, hookTransformResult.TriggerAPIParams) } t.Log("Test with Sample Pull Request data") { request := http.Request{ Header: http.Header{ "X-Event-Key": {"pullrequest:created"}, "Content-Type": {"application/json"}, "X-Attempt-Number": {"1"}, }, Body: ioutil.NopCloser(strings.NewReader(samplePullRequestData)), } hookTransformResult := provider.TransformRequest(&request) require.NoError(t, hookTransformResult.Error) require.False(t, hookTransformResult.ShouldSkip) require.Equal(t, []bitriseapi.TriggerAPIParamsModel{ { BuildParams: bitriseapi.BuildParamsModel{ CommitHash: "6a3451888d91", CommitMessage: "change", Branch: "feature/test", BranchDest: "master", PullRequestID: pointers.NewIntPtr(1), PullRequestRepositoryURL: "https://bitbucket.org/birmacher/prtest.git", }, }, }, hookTransformResult.TriggerAPIParams) } t.Log("X-Attempt-Number=1 - OK") { request := http.Request{ Header: http.Header{ "X-Event-Key": {"repo:push"}, "Content-Type": {"application/json"}, "X-Attempt-Number": {"1"}, }, Body: ioutil.NopCloser(strings.NewReader(sampleCodePushData)), } hookTransformResult := provider.TransformRequest(&request) require.NoError(t, hookTransformResult.Error) require.False(t, hookTransformResult.ShouldSkip) require.Equal(t, []bitriseapi.TriggerAPIParamsModel{ { BuildParams: bitriseapi.BuildParamsModel{ CommitHash: "966d0bfe79b80f97268c2f6bb45e65e79ef09b31", CommitMessage: "auto-test", Branch: "master", }, }, { BuildParams: bitriseapi.BuildParamsModel{ CommitHash: "19934139a2cf799bbd0f5061ab02e4760902e93f", CommitMessage: "auto-test 2", Branch: "test", }, }, }, hookTransformResult.TriggerAPIParams) } t.Log("X-Attempt-Number=2 - SKIP") { request := http.Request{ Header: http.Header{ "X-Event-Key": {"repo:push"}, "Content-Type": {"application/json"}, "X-Attempt-Number": {"2"}, }, Body: ioutil.NopCloser(strings.NewReader(sampleCodePushData)), } hookTransformResult := provider.TransformRequest(&request) require.EqualError(t, hookTransformResult.Error, "No retry is supported (X-Attempt-Number: 2)") require.False(t, hookTransformResult.ShouldSkip) require.Nil(t, hookTransformResult.TriggerAPIParams) } }
func Test_transformPullRequestEvent(t *testing.T) { t.Log("Empty Pull Request action") { pullRequest := PullRequestEventModel{} hookTransformResult := transformPullRequestEvent(pullRequest) require.True(t, hookTransformResult.ShouldSkip) require.EqualError(t, hookTransformResult.Error, "Pull Request type is not supported: ") } t.Log("Invalid type") { pullRequest := PullRequestEventModel{ PullRequestInfo: PullRequestInfoModel{ Type: "Issue", }, } hookTransformResult := transformPullRequestEvent(pullRequest) require.True(t, hookTransformResult.ShouldSkip) require.EqualError(t, hookTransformResult.Error, "Pull Request type is not supported: Issue") } t.Log("Already Merged") { pullRequest := PullRequestEventModel{ PullRequestInfo: PullRequestInfoModel{ Type: "pullrequest", State: "MERGED", }, } hookTransformResult := transformPullRequestEvent(pullRequest) require.True(t, hookTransformResult.ShouldSkip) require.EqualError(t, hookTransformResult.Error, "Pull Request state doesn't require a build: MERGED") } t.Log("Already Declined") { pullRequest := PullRequestEventModel{ PullRequestInfo: PullRequestInfoModel{ Type: "pullrequest", State: "DECLINED", }, } hookTransformResult := transformPullRequestEvent(pullRequest) require.True(t, hookTransformResult.ShouldSkip) require.EqualError(t, hookTransformResult.Error, "Pull Request state doesn't require a build: DECLINED") } t.Log("Open") { pullRequest := PullRequestEventModel{ PullRequestInfo: PullRequestInfoModel{ ID: 1, Type: "pullrequest", Title: "Title of pull request", State: "OPEN", SourceInfo: PullRequestBranchInfoModel{ BranchInfo: BranchInfoModel{ Name: "branch2", }, CommitInfo: CommitInfoModel{ CommitHash: "d3022fc0ca3d", }, RepositoryInfo: RepositoryInfoModel{ FullName: "foo/myrepo", }, }, DestinationInfo: PullRequestBranchInfoModel{ BranchInfo: BranchInfoModel{ Name: "master", }, CommitInfo: CommitInfoModel{ CommitHash: "ce5965ddd289", }, RepositoryInfo: RepositoryInfoModel{ FullName: "foo/myrepo", }, }, }, } hookTransformResult := transformPullRequestEvent(pullRequest) require.NoError(t, hookTransformResult.Error) require.False(t, hookTransformResult.ShouldSkip) require.Equal(t, []bitriseapi.TriggerAPIParamsModel{ { BuildParams: bitriseapi.BuildParamsModel{ CommitHash: "d3022fc0ca3d", CommitMessage: "Title of pull request", Branch: "branch2", BranchDest: "master", PullRequestID: pointers.NewIntPtr(1), PullRequestRepositoryURL: "https://bitbucket.org/foo/myrepo.git", }, }, }, hookTransformResult.TriggerAPIParams) } t.Log("Pull Request - Title & Body") { pullRequest := PullRequestEventModel{ PullRequestInfo: PullRequestInfoModel{ ID: 1, Type: "pullrequest", Title: "Title of pull request", Description: "Description of pull request", State: "OPEN", SourceInfo: PullRequestBranchInfoModel{ BranchInfo: BranchInfoModel{ Name: "branch2", }, CommitInfo: CommitInfoModel{ CommitHash: "d3022fc0ca3d", }, RepositoryInfo: RepositoryInfoModel{ FullName: "foo/myrepo", }, }, DestinationInfo: PullRequestBranchInfoModel{ BranchInfo: BranchInfoModel{ Name: "master", }, CommitInfo: CommitInfoModel{ CommitHash: "ce5965ddd289", }, RepositoryInfo: RepositoryInfoModel{ FullName: "foo/myrepo", }, }, }, } hookTransformResult := transformPullRequestEvent(pullRequest) require.NoError(t, hookTransformResult.Error) require.False(t, hookTransformResult.ShouldSkip) require.Equal(t, []bitriseapi.TriggerAPIParamsModel{ { BuildParams: bitriseapi.BuildParamsModel{ CommitHash: "d3022fc0ca3d", CommitMessage: "Title of pull request\n\nDescription of pull request", Branch: "branch2", BranchDest: "master", PullRequestID: pointers.NewIntPtr(1), PullRequestRepositoryURL: "https://bitbucket.org/foo/myrepo.git", }, }, }, hookTransformResult.TriggerAPIParams) } }
func Test_HookProvider_TransformRequest(t *testing.T) { provider := HookProvider{} t.Log("Code Push - should be handled") { request := http.Request{ Header: http.Header{ "X-Gitlab-Event": {"Push Hook"}, "Content-Type": {"application/json"}, }, Body: ioutil.NopCloser(strings.NewReader(sampleCodePushData)), } hookTransformResult := provider.TransformRequest(&request) require.NoError(t, hookTransformResult.Error) require.False(t, hookTransformResult.ShouldSkip) require.Equal(t, []bitriseapi.TriggerAPIParamsModel{ { BuildParams: bitriseapi.BuildParamsModel{ CommitHash: "1606d3dd4c4dc83ee8fed8d3cfd911da851bf740", CommitMessage: "second commit message", Branch: "develop", }, }, }, hookTransformResult.TriggerAPIParams) } t.Log("Push: Tag (create)") { request := http.Request{ Header: http.Header{ "X-Gitlab-Event": {"Tag Push Hook"}, "Content-Type": {"application/json"}, }, Body: ioutil.NopCloser(strings.NewReader(`{ "object_kind": "tag_push", "ref": "refs/tags/v0.0.2", "checkout_sha": "7f29cdf31fdff43d7f31a279eec06c9f19ae0d6b" }`)), } hookTransformResult := provider.TransformRequest(&request) require.NoError(t, hookTransformResult.Error) require.False(t, hookTransformResult.ShouldSkip) require.Equal(t, []bitriseapi.TriggerAPIParamsModel{ { BuildParams: bitriseapi.BuildParamsModel{ Tag: "v0.0.2", CommitHash: "7f29cdf31fdff43d7f31a279eec06c9f19ae0d6b", }, }, }, hookTransformResult.TriggerAPIParams) } t.Log("Push: Tag Delete") { request := http.Request{ Header: http.Header{ "X-Gitlab-Event": {"Tag Push Hook"}, "Content-Type": {"application/json"}, }, Body: ioutil.NopCloser(strings.NewReader(`{ "object_kind": "tag_push", "ref": "refs/tags/v0.0.2", "checkout_sha": null }`)), } hookTransformResult := provider.TransformRequest(&request) require.EqualError(t, hookTransformResult.Error, "This is a Tag Deleted event, no build is required") require.True(t, hookTransformResult.ShouldSkip) require.Nil(t, hookTransformResult.TriggerAPIParams) } t.Log("Merge Request - should be handled") { request := http.Request{ Header: http.Header{ "X-Gitlab-Event": {"Merge Request Hook"}, "Content-Type": {"application/json"}, }, Body: ioutil.NopCloser(strings.NewReader(sampleMergeRequestData)), } hookTransformResult := provider.TransformRequest(&request) require.NoError(t, hookTransformResult.Error) require.False(t, hookTransformResult.ShouldSkip) require.Equal(t, []bitriseapi.TriggerAPIParamsModel{ { BuildParams: bitriseapi.BuildParamsModel{ CommitHash: "da966425f32973b6290dcff6a443103c7ff2a8cb", CommitMessage: "PR test\n\nPR text body", Branch: "feature/github-pr", BranchDest: "develop", PullRequestID: pointers.NewIntPtr(12), PullRequestRepositoryURL: "https://gitlab.com/bitrise-io/bitrise-webhooks.git", PullRequestHeadBranch: "merge-requests/12/head", }, }, }, hookTransformResult.TriggerAPIParams) } t.Log("Unsuported Content-Type") { request := http.Request{ Header: http.Header{ "X-Gitlab-Event": {"Push Hook"}, "Content-Type": {"not/supported"}, }, Body: ioutil.NopCloser(strings.NewReader(sampleCodePushData)), } hookTransformResult := provider.TransformRequest(&request) require.False(t, hookTransformResult.ShouldSkip) require.EqualError(t, hookTransformResult.Error, "Content-Type is not supported: not/supported") } t.Log("Unsupported event type - should error") { request := http.Request{ Header: http.Header{ "X-Gitlab-Event": {"Unsupported Hook"}, "Content-Type": {"application/json"}, }, Body: ioutil.NopCloser(strings.NewReader(sampleCodePushData)), } hookTransformResult := provider.TransformRequest(&request) require.False(t, hookTransformResult.ShouldSkip) require.EqualError(t, hookTransformResult.Error, "Unsupported Webhook event: Unsupported Hook") } t.Log("No Request Body") { request := http.Request{ Header: http.Header{ "X-Gitlab-Event": {"Push Hook"}, "Content-Type": {"application/json"}, }, } hookTransformResult := provider.TransformRequest(&request) require.False(t, hookTransformResult.ShouldSkip) require.EqualError(t, hookTransformResult.Error, "Failed to read content of request body: no or empty request body") } }
func Test_transformMergeRequestEvent(t *testing.T) { t.Log("Unsupported Merge Request kind") { mergeRequest := MergeRequestEventModel{ ObjectKind: "labeled", } hookTransformResult := transformMergeRequestEvent(mergeRequest) require.True(t, hookTransformResult.ShouldSkip) require.EqualError(t, hookTransformResult.Error, "Not a Merge Request object") } t.Log("Empty Merge Request state") { mergeRequest := MergeRequestEventModel{ ObjectKind: "merge_request", ObjectAttributes: ObjectAttributesInfoModel{}, } hookTransformResult := transformMergeRequestEvent(mergeRequest) require.True(t, hookTransformResult.ShouldSkip) require.EqualError(t, hookTransformResult.Error, "No Merge Request state specified") } t.Log("Already Merged") { mergeRequest := MergeRequestEventModel{ ObjectKind: "merge_request", ObjectAttributes: ObjectAttributesInfoModel{ State: "opened", MergeCommitSHA: "asd123", }, } hookTransformResult := transformMergeRequestEvent(mergeRequest) require.True(t, hookTransformResult.ShouldSkip) require.EqualError(t, hookTransformResult.Error, "Merge Request already merged") } t.Log("Merge error") { mergeRequest := MergeRequestEventModel{ ObjectKind: "merge_request", ObjectAttributes: ObjectAttributesInfoModel{ State: "opened", MergeError: "Some merge error", }, } hookTransformResult := transformMergeRequestEvent(mergeRequest) require.True(t, hookTransformResult.ShouldSkip) require.EqualError(t, hookTransformResult.Error, "Merge Request is not mergeable") } t.Log("Not yet merged") { mergeRequest := MergeRequestEventModel{ ObjectKind: "merge_request", ObjectAttributes: ObjectAttributesInfoModel{ ID: 12, Title: "PR test", State: "opened", Source: BranchInfoModel{ VisibilityLevel: 20, GitSSHURL: "[email protected]:bitrise-io/bitrise-webhooks.git", GitHTTPURL: "https://gitlab.com/bitrise-io/bitrise-webhooks.git", }, SourceBranch: "feature/gitlab-pr", Target: BranchInfoModel{ VisibilityLevel: 20, GitSSHURL: "[email protected]:bitrise-io/bitrise-webhooks.git", GitHTTPURL: "https://gitlab.com/bitrise-io/bitrise-webhooks.git", }, TargetBranch: "master", LastCommit: LastCommitInfoModel{ SHA: "83b86e5f286f546dc5a4a58db66ceef44460c85e", }, }, } hookTransformResult := transformMergeRequestEvent(mergeRequest) require.NoError(t, hookTransformResult.Error) require.False(t, hookTransformResult.ShouldSkip) require.Equal(t, []bitriseapi.TriggerAPIParamsModel{ { BuildParams: bitriseapi.BuildParamsModel{ CommitHash: "83b86e5f286f546dc5a4a58db66ceef44460c85e", CommitMessage: "PR test", Branch: "feature/gitlab-pr", BranchDest: "master", PullRequestID: pointers.NewIntPtr(12), PullRequestRepositoryURL: "https://gitlab.com/bitrise-io/bitrise-webhooks.git", PullRequestHeadBranch: "merge-requests/12/head", }, }, }, hookTransformResult.TriggerAPIParams) } t.Log("Pull Request - Title & Body") { mergeRequest := MergeRequestEventModel{ ObjectKind: "merge_request", ObjectAttributes: ObjectAttributesInfoModel{ ID: 12, Title: "PR test", Description: "PR test body", State: "opened", Source: BranchInfoModel{ VisibilityLevel: 20, GitSSHURL: "[email protected]:bitrise-io/bitrise-webhooks.git", GitHTTPURL: "https://gitlab.com/bitrise-io/bitrise-webhooks.git", }, SourceBranch: "feature/gitlab-pr", Target: BranchInfoModel{ VisibilityLevel: 20, GitSSHURL: "[email protected]:bitrise-io/bitrise-webhooks.git", GitHTTPURL: "https://gitlab.com/bitrise-io/bitrise-webhooks.git", }, TargetBranch: "master", LastCommit: LastCommitInfoModel{ SHA: "83b86e5f286f546dc5a4a58db66ceef44460c85e", }, }, } hookTransformResult := transformMergeRequestEvent(mergeRequest) require.NoError(t, hookTransformResult.Error) require.False(t, hookTransformResult.ShouldSkip) require.Equal(t, []bitriseapi.TriggerAPIParamsModel{ { BuildParams: bitriseapi.BuildParamsModel{ CommitHash: "83b86e5f286f546dc5a4a58db66ceef44460c85e", CommitMessage: "PR test\n\nPR test body", Branch: "feature/gitlab-pr", BranchDest: "master", PullRequestID: pointers.NewIntPtr(12), PullRequestRepositoryURL: "https://gitlab.com/bitrise-io/bitrise-webhooks.git", PullRequestHeadBranch: "merge-requests/12/head", }, }, }, hookTransformResult.TriggerAPIParams) } }