From 94e04fda5a9de0b77878f2e561fb8d209e8e371e Mon Sep 17 00:00:00 2001 From: Rose Northey Date: Mon, 20 Apr 2026 17:01:58 +1200 Subject: [PATCH 1/9] WIP adding test broken --- pkg/filters/filter_type.go | 1 + pkg/filters/json.go | 4 +++ pkg/filters/webhook_trigger_filter.go | 26 ++++++++++++++++ test/e2e/project_trigger_test.go | 43 ++++++++++++++++++++++++++- 4 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 pkg/filters/webhook_trigger_filter.go diff --git a/pkg/filters/filter_type.go b/pkg/filters/filter_type.go index ffb1f526..f6f6593e 100644 --- a/pkg/filters/filter_type.go +++ b/pkg/filters/filter_type.go @@ -12,4 +12,5 @@ const ( OnceDailySchedule FeedFilter GitFilter + WebhookFilter ) diff --git a/pkg/filters/json.go b/pkg/filters/json.go index babdd93b..32305b27 100644 --- a/pkg/filters/json.go +++ b/pkg/filters/json.go @@ -52,6 +52,10 @@ func FromJson(rawMessage *json.RawMessage) (ITriggerFilter, error) { var filter *GitTriggerFilter err := json.Unmarshal(*rawMessage, &filter) return filter, err + case WebhookFilter: + var filter *WebhookTriggerFilter + err := json.Unmarshal(*rawMessage, &filter) + return filter, err } return nil, fmt.Errorf("unable to unmarshal filter from JSON") diff --git a/pkg/filters/webhook_trigger_filter.go b/pkg/filters/webhook_trigger_filter.go new file mode 100644 index 00000000..11bcdb27 --- /dev/null +++ b/pkg/filters/webhook_trigger_filter.go @@ -0,0 +1,26 @@ +package filters + +type WebhookTriggerFilter struct { + Password string `json:"Password"` + WebhookId string `json:"WebhookId,omitempty"` + + triggerFilter +} + +func NewWebhookTriggerFilter(password string) *WebhookTriggerFilter { + + return &WebhookTriggerFilter{ + triggerFilter: *newTriggerFilter(WebhookFilter), + Password: password, + } +} + +func (t *WebhookTriggerFilter) GetFilterType() FilterType { + return t.Type +} + +func (t *WebhookTriggerFilter) SetFilterType(filterType FilterType) { + t.Type = filterType +} + +var _ ITriggerFilter = &WebhookTriggerFilter{} diff --git a/test/e2e/project_trigger_test.go b/test/e2e/project_trigger_test.go index b3f84145..4881c37c 100644 --- a/test/e2e/project_trigger_test.go +++ b/test/e2e/project_trigger_test.go @@ -65,7 +65,7 @@ func CreateTestProjectTrigger(t *testing.T, client *client.Client, project *proj require.NotNil(t, projectTrigger) require.NoError(t, projectTrigger.Validate()) - createdProjectTrigger, err := client.ProjectTriggers.Add(projectTrigger) + createdProjectTrigger, err := triggers.Add(client, projectTrigger) require.NoError(t, err) require.NotNil(t, createdProjectTrigger) require.NotEmpty(t, createdProjectTrigger.GetID()) @@ -79,6 +79,47 @@ func CreateTestProjectTrigger(t *testing.T, client *client.Client, project *proj return createdProjectTrigger } +func TestProjectScheduledRunbookTrigger(t *testing.T) { + client := getOctopusClient() + require.NotNil(t, client) + + space := GetDefaultSpace(t, client) + require.NotNil(t, space) + + lifecycle := CreateTestLifecycle(t, client) + require.NotNil(t, lifecycle) + defer DeleteTestLifecycle(t, client, lifecycle) + + projectGroup := CreateTestProjectGroup(t, client) + require.NotNil(t, projectGroup) + defer DeleteTestProjectGroup(t, client, projectGroup) + + project := CreateTestProject(t, client, space, lifecycle, projectGroup) + require.NotNil(t, project) + defer DeleteTestProject(t, client, project) + + action := actions.NewRunRunbookAction() + + password := internal.GetRandomName() + + filter := filters.NewWebhookTriggerFilter(password) + + projectTrigger := triggers.NewProjectTrigger(internal.GetRandomName(), internal.GetRandomName(), createRandomBoolean(), project, action, filter) + require.NotNil(t, projectTrigger) + require.NoError(t, projectTrigger.Validate()) + + createdProjectTrigger, err := triggers.Add(client, projectTrigger) + require.NoError(t, err) + require.NotNil(t, createdProjectTrigger) + require.NotEmpty(t, createdProjectTrigger.GetID()) + + // verify the add operation was successful + projectTriggerToCompare, err := triggers.GetById(client, project.SpaceID, createdProjectTrigger.GetID()) + require.NoError(t, err) + require.NotNil(t, projectTriggerToCompare) + AssertEqualProjectTriggers(t, createdProjectTrigger, projectTriggerToCompare) +} + func DeleteTestProjectTrigger(t *testing.T, client *client.Client, projectTrigger *triggers.ProjectTrigger) { require.NotNil(t, projectTrigger) From f102747aedee691e81c8042fca33985dfe957ace Mon Sep 17 00:00:00 2001 From: Ben Pearce Date: Mon, 20 Apr 2026 18:07:00 +1000 Subject: [PATCH 2/9] chore: regenerate filter enum chore: add runbook to test --- pkg/filters/filter_type_string.go | 14 +++++++++----- test/e2e/project_trigger_test.go | 5 +++++ 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/pkg/filters/filter_type_string.go b/pkg/filters/filter_type_string.go index 4938af8f..50ba9071 100644 --- a/pkg/filters/filter_type_string.go +++ b/pkg/filters/filter_type_string.go @@ -1,4 +1,4 @@ -// Code generated by "enumer -type=FilterType -json -output=C:\dev\go-octopusdeploy\pkg\filters\filter_type_string.go"; DO NOT EDIT. +// Code generated by "enumer -type=FilterType -json -output filter_type_string.go"; DO NOT EDIT. package filters @@ -8,11 +8,11 @@ import ( "strings" ) -const _FilterTypeName = "ContinuousDailyScheduleCronExpressionScheduleDailyScheduleDaysPerMonthScheduleDaysPerWeekScheduleMachineFilterOnceDailyScheduleFeedFilterGitFilter" +const _FilterTypeName = "ContinuousDailyScheduleCronExpressionScheduleDailyScheduleDaysPerMonthScheduleDaysPerWeekScheduleMachineFilterOnceDailyScheduleFeedFilterGitFilterWebhookFilter" -var _FilterTypeIndex = [...]uint8{0, 23, 45, 58, 78, 97, 110, 127, 137, 146} +var _FilterTypeIndex = [...]uint8{0, 23, 45, 58, 78, 97, 110, 127, 137, 146, 159} -const _FilterTypeLowerName = "continuousdailyschedulecronexpressionscheduledailyscheduledayspermonthscheduledaysperweekschedulemachinefilteroncedailyschedulefeedfiltergitfilter" +const _FilterTypeLowerName = "continuousdailyschedulecronexpressionscheduledailyscheduledayspermonthscheduledaysperweekschedulemachinefilteroncedailyschedulefeedfiltergitfilterwebhookfilter" func (i FilterType) String() string { if i < 0 || i >= FilterType(len(_FilterTypeIndex)-1) { @@ -34,9 +34,10 @@ func _FilterTypeNoOp() { _ = x[OnceDailySchedule-(6)] _ = x[FeedFilter-(7)] _ = x[GitFilter-(8)] + _ = x[WebhookFilter-(9)] } -var _FilterTypeValues = []FilterType{ContinuousDailySchedule, CronExpressionSchedule, DailySchedule, DaysPerMonthSchedule, DaysPerWeekSchedule, MachineFilter, OnceDailySchedule, FeedFilter, GitFilter} +var _FilterTypeValues = []FilterType{ContinuousDailySchedule, CronExpressionSchedule, DailySchedule, DaysPerMonthSchedule, DaysPerWeekSchedule, MachineFilter, OnceDailySchedule, FeedFilter, GitFilter, WebhookFilter} var _FilterTypeNameToValueMap = map[string]FilterType{ _FilterTypeName[0:23]: ContinuousDailySchedule, @@ -57,6 +58,8 @@ var _FilterTypeNameToValueMap = map[string]FilterType{ _FilterTypeLowerName[127:137]: FeedFilter, _FilterTypeName[137:146]: GitFilter, _FilterTypeLowerName[137:146]: GitFilter, + _FilterTypeName[146:159]: WebhookFilter, + _FilterTypeLowerName[146:159]: WebhookFilter, } var _FilterTypeNames = []string{ @@ -69,6 +72,7 @@ var _FilterTypeNames = []string{ _FilterTypeName[110:127], _FilterTypeName[127:137], _FilterTypeName[137:146], + _FilterTypeName[146:159], } // FilterTypeString retrieves an enum value from the enum constants string name. diff --git a/test/e2e/project_trigger_test.go b/test/e2e/project_trigger_test.go index 4881c37c..10ee5c8a 100644 --- a/test/e2e/project_trigger_test.go +++ b/test/e2e/project_trigger_test.go @@ -98,7 +98,12 @@ func TestProjectScheduledRunbookTrigger(t *testing.T) { require.NotNil(t, project) defer DeleteTestProject(t, client, project) + runbook := CreateTestRunbook(t, client, lifecycle, projectGroup, project) + require.NotNil(t, runbook) + defer DeleteTestRunbook(t, client, runbook) + action := actions.NewRunRunbookAction() + action.Runbook = runbook.GetID() password := internal.GetRandomName() From c0576119ddc69706a403e3a1020da6bdc21c42ab Mon Sep 17 00:00:00 2001 From: Rose Northey Date: Tue, 21 Apr 2026 09:12:13 +1200 Subject: [PATCH 3/9] Correct type of secret --- pkg/filters/webhook_trigger_filter.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/pkg/filters/webhook_trigger_filter.go b/pkg/filters/webhook_trigger_filter.go index 11bcdb27..61649316 100644 --- a/pkg/filters/webhook_trigger_filter.go +++ b/pkg/filters/webhook_trigger_filter.go @@ -1,17 +1,19 @@ package filters +import "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/core" + type WebhookTriggerFilter struct { - Password string `json:"Password"` - WebhookId string `json:"WebhookId,omitempty"` + Secret core.SensitiveValue `json:"Secret"` + WebhookId string `json:"WebhookId,omitempty"` triggerFilter } -func NewWebhookTriggerFilter(password string) *WebhookTriggerFilter { +func NewWebhookTriggerFilter(secret core.SensitiveValue) *WebhookTriggerFilter { return &WebhookTriggerFilter{ triggerFilter: *newTriggerFilter(WebhookFilter), - Password: password, + Secret: secret, } } From 6fe608bdd8f17327ae9e13840840f6573a7b1151 Mon Sep 17 00:00:00 2001 From: Rose Northey Date: Tue, 21 Apr 2026 09:12:38 +1200 Subject: [PATCH 4/9] fix runbook webhook test --- test/e2e/project_trigger_test.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/test/e2e/project_trigger_test.go b/test/e2e/project_trigger_test.go index 10ee5c8a..ad1ab169 100644 --- a/test/e2e/project_trigger_test.go +++ b/test/e2e/project_trigger_test.go @@ -7,6 +7,7 @@ import ( "github.com/OctopusDeploy/go-octopusdeploy/v2/internal" "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/actions" "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/client" + "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/core" "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/environments" "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/filters" "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/projects" @@ -90,6 +91,10 @@ func TestProjectScheduledRunbookTrigger(t *testing.T) { require.NotNil(t, lifecycle) defer DeleteTestLifecycle(t, client, lifecycle) + environment := CreateTestEnvironment(t, client) + require.NotNil(t, environment) + defer DeleteTestEnvironment(t, client, environment) + projectGroup := CreateTestProjectGroup(t, client) require.NotNil(t, projectGroup) defer DeleteTestProjectGroup(t, client, projectGroup) @@ -104,10 +109,12 @@ func TestProjectScheduledRunbookTrigger(t *testing.T) { action := actions.NewRunRunbookAction() action.Runbook = runbook.GetID() + action.Environments = []string{environment.GetID()} - password := internal.GetRandomName() + password := getShortRandomName() + secret := core.SensitiveValue{HasValue: true, NewValue: &password} - filter := filters.NewWebhookTriggerFilter(password) + filter := filters.NewWebhookTriggerFilter(secret) projectTrigger := triggers.NewProjectTrigger(internal.GetRandomName(), internal.GetRandomName(), createRandomBoolean(), project, action, filter) require.NotNil(t, projectTrigger) From 527826972503c791b5d52b54ae79af541ea98d48 Mon Sep 17 00:00:00 2001 From: Rose Northey Date: Tue, 21 Apr 2026 09:25:06 +1200 Subject: [PATCH 5/9] Change the client pattern to new standards --- test/e2e/project_trigger_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/e2e/project_trigger_test.go b/test/e2e/project_trigger_test.go index ad1ab169..b34e8874 100644 --- a/test/e2e/project_trigger_test.go +++ b/test/e2e/project_trigger_test.go @@ -72,7 +72,7 @@ func CreateTestProjectTrigger(t *testing.T, client *client.Client, project *proj require.NotEmpty(t, createdProjectTrigger.GetID()) // verify the add operation was successful - projectTriggerToCompare, err := client.ProjectTriggers.GetByID(createdProjectTrigger.GetID()) + projectTriggerToCompare, err := triggers.GetById(client, project.SpaceID, createdProjectTrigger.GetID()) require.NoError(t, err) require.NotNil(t, projectTriggerToCompare) AssertEqualProjectTriggers(t, createdProjectTrigger, projectTriggerToCompare) @@ -140,11 +140,11 @@ func DeleteTestProjectTrigger(t *testing.T, client *client.Client, projectTrigge } require.NotNil(t, client) - err := client.ProjectTriggers.Delete(projectTrigger) + err := triggers.DeleteById(client, projectTrigger.SpaceID, projectTrigger.ID) assert.NoError(t, err) // verify the delete operation was successful - deletedProjectTrigger, err := client.ProjectTriggers.GetByID(projectTrigger.GetID()) + deletedProjectTrigger, err := triggers.GetById(client, projectTrigger.SpaceID, projectTrigger.GetID()) assert.Error(t, err) assert.Nil(t, deletedProjectTrigger) } From 631519b2d1bf65821e8a0f415f649dffb74bf5d2 Mon Sep 17 00:00:00 2001 From: Rose Northey Date: Tue, 21 Apr 2026 09:26:55 +1200 Subject: [PATCH 6/9] Change all "client" names to "octopusClient" due to an import clash --- test/e2e/project_trigger_test.go | 126 +++++++++++++++---------------- 1 file changed, 63 insertions(+), 63 deletions(-) diff --git a/test/e2e/project_trigger_test.go b/test/e2e/project_trigger_test.go index b34e8874..927d7f36 100644 --- a/test/e2e/project_trigger_test.go +++ b/test/e2e/project_trigger_test.go @@ -81,31 +81,31 @@ func CreateTestProjectTrigger(t *testing.T, client *client.Client, project *proj } func TestProjectScheduledRunbookTrigger(t *testing.T) { - client := getOctopusClient() - require.NotNil(t, client) + octopusClient := getOctopusClient() + require.NotNil(t, octopusClient) - space := GetDefaultSpace(t, client) + space := GetDefaultSpace(t, octopusClient) require.NotNil(t, space) - lifecycle := CreateTestLifecycle(t, client) + lifecycle := CreateTestLifecycle(t, octopusClient) require.NotNil(t, lifecycle) - defer DeleteTestLifecycle(t, client, lifecycle) + defer DeleteTestLifecycle(t, octopusClient, lifecycle) - environment := CreateTestEnvironment(t, client) + environment := CreateTestEnvironment(t, octopusClient) require.NotNil(t, environment) - defer DeleteTestEnvironment(t, client, environment) + defer DeleteTestEnvironment(t, octopusClient, environment) - projectGroup := CreateTestProjectGroup(t, client) + projectGroup := CreateTestProjectGroup(t, octopusClient) require.NotNil(t, projectGroup) - defer DeleteTestProjectGroup(t, client, projectGroup) + defer DeleteTestProjectGroup(t, octopusClient, projectGroup) - project := CreateTestProject(t, client, space, lifecycle, projectGroup) + project := CreateTestProject(t, octopusClient, space, lifecycle, projectGroup) require.NotNil(t, project) - defer DeleteTestProject(t, client, project) + defer DeleteTestProject(t, octopusClient, project) - runbook := CreateTestRunbook(t, client, lifecycle, projectGroup, project) + runbook := CreateTestRunbook(t, octopusClient, lifecycle, projectGroup, project) require.NotNil(t, runbook) - defer DeleteTestRunbook(t, client, runbook) + defer DeleteTestRunbook(t, octopusClient, runbook) action := actions.NewRunRunbookAction() action.Runbook = runbook.GetID() @@ -120,13 +120,13 @@ func TestProjectScheduledRunbookTrigger(t *testing.T) { require.NotNil(t, projectTrigger) require.NoError(t, projectTrigger.Validate()) - createdProjectTrigger, err := triggers.Add(client, projectTrigger) + createdProjectTrigger, err := triggers.Add(octopusClient, projectTrigger) require.NoError(t, err) require.NotNil(t, createdProjectTrigger) require.NotEmpty(t, createdProjectTrigger.GetID()) // verify the add operation was successful - projectTriggerToCompare, err := triggers.GetById(client, project.SpaceID, createdProjectTrigger.GetID()) + projectTriggerToCompare, err := triggers.GetById(octopusClient, project.SpaceID, createdProjectTrigger.GetID()) require.NoError(t, err) require.NotNil(t, projectTriggerToCompare) AssertEqualProjectTriggers(t, createdProjectTrigger, projectTriggerToCompare) @@ -165,57 +165,57 @@ func UpdateTestProjectTrigger(t *testing.T, client *client.Client, projectTrigge } func TestProjectTriggerAddGetUpdateDelete(t *testing.T) { - client := getOctopusClient() - require.NotNil(t, client) + octopusClient := getOctopusClient() + require.NotNil(t, octopusClient) - space := GetDefaultSpace(t, client) + space := GetDefaultSpace(t, octopusClient) require.NotNil(t, space) - lifecycle := CreateTestLifecycle(t, client) + lifecycle := CreateTestLifecycle(t, octopusClient) require.NotNil(t, lifecycle) - defer DeleteTestLifecycle(t, client, lifecycle) + defer DeleteTestLifecycle(t, octopusClient, lifecycle) - projectGroup := CreateTestProjectGroup(t, client) + projectGroup := CreateTestProjectGroup(t, octopusClient) require.NotNil(t, projectGroup) - defer DeleteTestProjectGroup(t, client, projectGroup) + defer DeleteTestProjectGroup(t, octopusClient, projectGroup) - project := CreateTestProject(t, client, space, lifecycle, projectGroup) + project := CreateTestProject(t, octopusClient, space, lifecycle, projectGroup) require.NotNil(t, project) - defer DeleteTestProject(t, client, project) + defer DeleteTestProject(t, octopusClient, project) - environment := CreateTestEnvironment(t, client) + environment := CreateTestEnvironment(t, octopusClient) require.NotNil(t, environment) - defer DeleteTestEnvironment(t, client, environment) + defer DeleteTestEnvironment(t, octopusClient, environment) - projectTrigger := CreateTestProjectTrigger(t, client, project, environment) + projectTrigger := CreateTestProjectTrigger(t, octopusClient, project, environment) require.NotNil(t, lifecycle) - defer DeleteTestProjectTrigger(t, client, projectTrigger) + defer DeleteTestProjectTrigger(t, octopusClient, projectTrigger) projectTrigger.Name = GetRandomName() - updatedProjectTrigger := UpdateTestProjectTrigger(t, client, projectTrigger) + updatedProjectTrigger := UpdateTestProjectTrigger(t, octopusClient, projectTrigger) require.NotNil(t, updatedProjectTrigger) } func TestProjectTriggerGetAll(t *testing.T) { - client := getOctopusClient() - require.NotNil(t, client) + octopusClient := getOctopusClient() + require.NotNil(t, octopusClient) - space := GetDefaultSpace(t, client) + space := GetDefaultSpace(t, octopusClient) require.NotNil(t, space) - lifecycle := CreateTestLifecycle(t, client) + lifecycle := CreateTestLifecycle(t, octopusClient) require.NotNil(t, lifecycle) - defer DeleteTestLifecycle(t, client, lifecycle) + defer DeleteTestLifecycle(t, octopusClient, lifecycle) - projectGroup := CreateTestProjectGroup(t, client) + projectGroup := CreateTestProjectGroup(t, octopusClient) require.NotNil(t, projectGroup) - defer DeleteTestProjectGroup(t, client, projectGroup) + defer DeleteTestProjectGroup(t, octopusClient, projectGroup) - project := CreateTestProject(t, client, space, lifecycle, projectGroup) + project := CreateTestProject(t, octopusClient, space, lifecycle, projectGroup) require.NotNil(t, project) - defer DeleteTestProject(t, client, project) + defer DeleteTestProject(t, octopusClient, project) - projectTriggers, err := client.ProjectTriggers.GetAll() + projectTriggers, err := octopusClient.ProjectTriggers.GetAll() require.NoError(t, err) require.NotNil(t, projectTriggers) } @@ -296,57 +296,57 @@ func New_UpdateTestProjectTrigger(t *testing.T, client *client.Client, projectTr } func New_TestProjectTriggerAddGetUpdateDelete(t *testing.T) { - client := getOctopusClient() - require.NotNil(t, client) + octopusClient := getOctopusClient() + require.NotNil(t, octopusClient) - space := GetDefaultSpace(t, client) + space := GetDefaultSpace(t, octopusClient) require.NotNil(t, space) - lifecycle := CreateTestLifecycle(t, client) + lifecycle := CreateTestLifecycle(t, octopusClient) require.NotNil(t, lifecycle) - defer DeleteTestLifecycle(t, client, lifecycle) + defer DeleteTestLifecycle(t, octopusClient, lifecycle) - projectGroup := CreateTestProjectGroup(t, client) + projectGroup := CreateTestProjectGroup(t, octopusClient) require.NotNil(t, projectGroup) - defer DeleteTestProjectGroup(t, client, projectGroup) + defer DeleteTestProjectGroup(t, octopusClient, projectGroup) - project := CreateTestProject(t, client, space, lifecycle, projectGroup) + project := CreateTestProject(t, octopusClient, space, lifecycle, projectGroup) require.NotNil(t, project) - defer DeleteTestProject(t, client, project) + defer DeleteTestProject(t, octopusClient, project) - environment := CreateTestEnvironment(t, client) + environment := CreateTestEnvironment(t, octopusClient) require.NotNil(t, environment) - defer DeleteTestEnvironment(t, client, environment) + defer DeleteTestEnvironment(t, octopusClient, environment) - projectTrigger := New_CreateTestProjectTrigger(t, client, project) + projectTrigger := New_CreateTestProjectTrigger(t, octopusClient, project) require.NotNil(t, lifecycle) - defer New_DeleteTestProjectTrigger(t, client, projectTrigger) + defer New_DeleteTestProjectTrigger(t, octopusClient, projectTrigger) projectTrigger.Name = GetRandomName() - updatedProjectTrigger := New_UpdateTestProjectTrigger(t, client, projectTrigger) + updatedProjectTrigger := New_UpdateTestProjectTrigger(t, octopusClient, projectTrigger) require.NotNil(t, updatedProjectTrigger) } func New_TestProjectTriggerGetAll(t *testing.T) { - client := getOctopusClient() - require.NotNil(t, client) + octopusClient := getOctopusClient() + require.NotNil(t, octopusClient) - space := GetDefaultSpace(t, client) + space := GetDefaultSpace(t, octopusClient) require.NotNil(t, space) - lifecycle := CreateTestLifecycle(t, client) + lifecycle := CreateTestLifecycle(t, octopusClient) require.NotNil(t, lifecycle) - defer DeleteTestLifecycle(t, client, lifecycle) + defer DeleteTestLifecycle(t, octopusClient, lifecycle) - projectGroup := CreateTestProjectGroup(t, client) + projectGroup := CreateTestProjectGroup(t, octopusClient) require.NotNil(t, projectGroup) - defer DeleteTestProjectGroup(t, client, projectGroup) + defer DeleteTestProjectGroup(t, octopusClient, projectGroup) - project := CreateTestProject(t, client, space, lifecycle, projectGroup) + project := CreateTestProject(t, octopusClient, space, lifecycle, projectGroup) require.NotNil(t, project) - defer DeleteTestProject(t, client, project) + defer DeleteTestProject(t, octopusClient, project) - projectTriggers, err := triggers.GetAll(client, space.ID) + projectTriggers, err := triggers.GetAll(octopusClient, space.ID) require.NoError(t, err) require.NotNil(t, projectTriggers) } From 0320c3944c26a5979c3a773d7e9f2da373afd8a3 Mon Sep 17 00:00:00 2001 From: Rose Northey Date: Tue, 21 Apr 2026 09:29:32 +1200 Subject: [PATCH 7/9] delete unused code --- test/e2e/project_trigger_test.go | 136 +------------------------------ 1 file changed, 2 insertions(+), 134 deletions(-) diff --git a/test/e2e/project_trigger_test.go b/test/e2e/project_trigger_test.go index 927d7f36..233efbd7 100644 --- a/test/e2e/project_trigger_test.go +++ b/test/e2e/project_trigger_test.go @@ -8,7 +8,6 @@ import ( "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/actions" "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/client" "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/core" - "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/environments" "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/filters" "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/projects" "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/triggers" @@ -40,7 +39,7 @@ func AssertEqualProjectTriggers(t *testing.T, expected *triggers.ProjectTrigger, assert.Equal(t, expected.SpaceID, actual.SpaceID) } -func CreateTestProjectTrigger(t *testing.T, client *client.Client, project *projects.Project, environment *environments.Environment) *triggers.ProjectTrigger { +func CreateTestProjectTrigger(t *testing.T, client *client.Client, project *projects.Project) *triggers.ProjectTrigger { require.NotNil(t, project) if client == nil { @@ -187,7 +186,7 @@ func TestProjectTriggerAddGetUpdateDelete(t *testing.T) { require.NotNil(t, environment) defer DeleteTestEnvironment(t, octopusClient, environment) - projectTrigger := CreateTestProjectTrigger(t, octopusClient, project, environment) + projectTrigger := CreateTestProjectTrigger(t, octopusClient, project) require.NotNil(t, lifecycle) defer DeleteTestProjectTrigger(t, octopusClient, projectTrigger) @@ -219,134 +218,3 @@ func TestProjectTriggerGetAll(t *testing.T) { require.NoError(t, err) require.NotNil(t, projectTriggers) } - -// ----- new ----- - -func New_CreateTestProjectTrigger(t *testing.T, client *client.Client, project *projects.Project) *triggers.ProjectTrigger { - require.NotNil(t, project) - - if client == nil { - client = getOctopusClient() - } - require.NotNil(t, client) - - space := GetDefaultSpace(t, client) - require.NotNil(t, space) - - now := time.Now() - start := time.Date(now.Year(), now.Month(), now.Day(), 9, 0, 0, 0, time.UTC) - - action := actions.NewAutoDeployAction(createRandomBoolean()) - filter := filters.NewOnceDailyScheduledTriggerFilter([]filters.Weekday{filters.Tuesday}, start) - - projectTrigger := triggers.NewProjectTrigger(internal.GetRandomName(), internal.GetRandomName(), createRandomBoolean(), project, action, filter) - require.NotNil(t, projectTrigger) - require.NoError(t, projectTrigger.Validate()) - - createdProjectTrigger, err := client.ProjectTriggers.Add(projectTrigger) - require.NoError(t, err) - require.NotNil(t, createdProjectTrigger) - require.NotEmpty(t, createdProjectTrigger.GetID()) - - // verify the add operation was successful - projectTriggerToCompare, err := triggers.GetById(client, space.ID, createdProjectTrigger.GetID()) - require.NoError(t, err) - require.NotNil(t, projectTriggerToCompare) - AssertEqualProjectTriggers(t, createdProjectTrigger, projectTriggerToCompare) - - return createdProjectTrigger -} - -func New_DeleteTestProjectTrigger(t *testing.T, client *client.Client, projectTrigger *triggers.ProjectTrigger) { - require.NotNil(t, projectTrigger) - - if client == nil { - client = getOctopusClient() - } - require.NotNil(t, client) - - space := GetDefaultSpace(t, client) - require.NotNil(t, space) - - err := triggers.DeleteById(client, space.ID, projectTrigger.ID) - assert.NoError(t, err) - - // verify the delete operation was successful - deletedProjectTrigger, err := triggers.GetById(client, space.ID, projectTrigger.GetID()) - assert.Error(t, err) - assert.Nil(t, deletedProjectTrigger) -} - -func New_UpdateTestProjectTrigger(t *testing.T, client *client.Client, projectTrigger *triggers.ProjectTrigger) *triggers.ProjectTrigger { - require.NotNil(t, projectTrigger) - - if client == nil { - client = getOctopusClient() - } - require.NotNil(t, client) - - space := GetDefaultSpace(t, client) - require.NotNil(t, space) - - projectTrigger, err := triggers.Update(client, projectTrigger) - assert.NoError(t, err) - assert.NotNil(t, projectTrigger) - - return projectTrigger -} - -func New_TestProjectTriggerAddGetUpdateDelete(t *testing.T) { - octopusClient := getOctopusClient() - require.NotNil(t, octopusClient) - - space := GetDefaultSpace(t, octopusClient) - require.NotNil(t, space) - - lifecycle := CreateTestLifecycle(t, octopusClient) - require.NotNil(t, lifecycle) - defer DeleteTestLifecycle(t, octopusClient, lifecycle) - - projectGroup := CreateTestProjectGroup(t, octopusClient) - require.NotNil(t, projectGroup) - defer DeleteTestProjectGroup(t, octopusClient, projectGroup) - - project := CreateTestProject(t, octopusClient, space, lifecycle, projectGroup) - require.NotNil(t, project) - defer DeleteTestProject(t, octopusClient, project) - - environment := CreateTestEnvironment(t, octopusClient) - require.NotNil(t, environment) - defer DeleteTestEnvironment(t, octopusClient, environment) - - projectTrigger := New_CreateTestProjectTrigger(t, octopusClient, project) - require.NotNil(t, lifecycle) - defer New_DeleteTestProjectTrigger(t, octopusClient, projectTrigger) - - projectTrigger.Name = GetRandomName() - updatedProjectTrigger := New_UpdateTestProjectTrigger(t, octopusClient, projectTrigger) - require.NotNil(t, updatedProjectTrigger) -} - -func New_TestProjectTriggerGetAll(t *testing.T) { - octopusClient := getOctopusClient() - require.NotNil(t, octopusClient) - - space := GetDefaultSpace(t, octopusClient) - require.NotNil(t, space) - - lifecycle := CreateTestLifecycle(t, octopusClient) - require.NotNil(t, lifecycle) - defer DeleteTestLifecycle(t, octopusClient, lifecycle) - - projectGroup := CreateTestProjectGroup(t, octopusClient) - require.NotNil(t, projectGroup) - defer DeleteTestProjectGroup(t, octopusClient, projectGroup) - - project := CreateTestProject(t, octopusClient, space, lifecycle, projectGroup) - require.NotNil(t, project) - defer DeleteTestProject(t, octopusClient, project) - - projectTriggers, err := triggers.GetAll(octopusClient, space.ID) - require.NoError(t, err) - require.NotNil(t, projectTriggers) -} From 1429a09ac8a49529ad3aa4a15ce98d730d711bd1 Mon Sep 17 00:00:00 2001 From: Rose Northey Date: Tue, 21 Apr 2026 09:52:43 +1200 Subject: [PATCH 8/9] refactor repeated code into a helper function add helper function Move runbook webhook function rename helper function delete file reorder helper functions --- test/e2e/project_trigger_test.go | 126 +++++++++++++------------------ 1 file changed, 52 insertions(+), 74 deletions(-) diff --git a/test/e2e/project_trigger_test.go b/test/e2e/project_trigger_test.go index 233efbd7..b01d0702 100644 --- a/test/e2e/project_trigger_test.go +++ b/test/e2e/project_trigger_test.go @@ -9,6 +9,8 @@ import ( "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/client" "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/core" "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/filters" + "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/lifecycles" + "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/projectgroups" "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/projects" "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/triggers" "github.com/stretchr/testify/assert" @@ -39,7 +41,7 @@ func AssertEqualProjectTriggers(t *testing.T, expected *triggers.ProjectTrigger, assert.Equal(t, expected.SpaceID, actual.SpaceID) } -func CreateTestProjectTrigger(t *testing.T, client *client.Client, project *projects.Project) *triggers.ProjectTrigger { +func CreateTestScheduledProjectTriggerWithOnceDailyFilter(t *testing.T, client *client.Client, project *projects.Project) *triggers.ProjectTrigger { require.NotNil(t, project) if client == nil { @@ -79,58 +81,6 @@ func CreateTestProjectTrigger(t *testing.T, client *client.Client, project *proj return createdProjectTrigger } -func TestProjectScheduledRunbookTrigger(t *testing.T) { - octopusClient := getOctopusClient() - require.NotNil(t, octopusClient) - - space := GetDefaultSpace(t, octopusClient) - require.NotNil(t, space) - - lifecycle := CreateTestLifecycle(t, octopusClient) - require.NotNil(t, lifecycle) - defer DeleteTestLifecycle(t, octopusClient, lifecycle) - - environment := CreateTestEnvironment(t, octopusClient) - require.NotNil(t, environment) - defer DeleteTestEnvironment(t, octopusClient, environment) - - projectGroup := CreateTestProjectGroup(t, octopusClient) - require.NotNil(t, projectGroup) - defer DeleteTestProjectGroup(t, octopusClient, projectGroup) - - project := CreateTestProject(t, octopusClient, space, lifecycle, projectGroup) - require.NotNil(t, project) - defer DeleteTestProject(t, octopusClient, project) - - runbook := CreateTestRunbook(t, octopusClient, lifecycle, projectGroup, project) - require.NotNil(t, runbook) - defer DeleteTestRunbook(t, octopusClient, runbook) - - action := actions.NewRunRunbookAction() - action.Runbook = runbook.GetID() - action.Environments = []string{environment.GetID()} - - password := getShortRandomName() - secret := core.SensitiveValue{HasValue: true, NewValue: &password} - - filter := filters.NewWebhookTriggerFilter(secret) - - projectTrigger := triggers.NewProjectTrigger(internal.GetRandomName(), internal.GetRandomName(), createRandomBoolean(), project, action, filter) - require.NotNil(t, projectTrigger) - require.NoError(t, projectTrigger.Validate()) - - createdProjectTrigger, err := triggers.Add(octopusClient, projectTrigger) - require.NoError(t, err) - require.NotNil(t, createdProjectTrigger) - require.NotEmpty(t, createdProjectTrigger.GetID()) - - // verify the add operation was successful - projectTriggerToCompare, err := triggers.GetById(octopusClient, project.SpaceID, createdProjectTrigger.GetID()) - require.NoError(t, err) - require.NotNil(t, projectTriggerToCompare) - AssertEqualProjectTriggers(t, createdProjectTrigger, projectTriggerToCompare) -} - func DeleteTestProjectTrigger(t *testing.T, client *client.Client, projectTrigger *triggers.ProjectTrigger) { require.NotNil(t, projectTrigger) @@ -163,7 +113,8 @@ func UpdateTestProjectTrigger(t *testing.T, client *client.Client, projectTrigge return projectTrigger } -func TestProjectTriggerAddGetUpdateDelete(t *testing.T) { +func SetupClientAndProjectAndLifecycleAndProjectGroup(t *testing.T) (*client.Client, *projects.Project, *lifecycles.Lifecycle, + *projectgroups.ProjectGroup) { octopusClient := getOctopusClient() require.NotNil(t, octopusClient) @@ -172,21 +123,28 @@ func TestProjectTriggerAddGetUpdateDelete(t *testing.T) { lifecycle := CreateTestLifecycle(t, octopusClient) require.NotNil(t, lifecycle) - defer DeleteTestLifecycle(t, octopusClient, lifecycle) + t.Cleanup(func() { DeleteTestLifecycle(t, octopusClient, lifecycle) }) projectGroup := CreateTestProjectGroup(t, octopusClient) require.NotNil(t, projectGroup) - defer DeleteTestProjectGroup(t, octopusClient, projectGroup) + t.Cleanup(func() { DeleteTestProjectGroup(t, octopusClient, projectGroup) }) - project := CreateTestProject(t, octopusClient, space, lifecycle, projectGroup) + project := CreateTestProject(t, octopusClient, space, lifecycle, + projectGroup) require.NotNil(t, project) - defer DeleteTestProject(t, octopusClient, project) + t.Cleanup(func() { DeleteTestProject(t, octopusClient, project) }) + + return octopusClient, project, lifecycle, projectGroup +} + +func TestProjectTriggerAddGetUpdateDelete(t *testing.T) { + octopusClient, project, lifecycle, _ := SetupClientAndProjectAndLifecycleAndProjectGroup(t) environment := CreateTestEnvironment(t, octopusClient) require.NotNil(t, environment) defer DeleteTestEnvironment(t, octopusClient, environment) - projectTrigger := CreateTestProjectTrigger(t, octopusClient, project) + projectTrigger := CreateTestScheduledProjectTriggerWithOnceDailyFilter(t, octopusClient, project) require.NotNil(t, lifecycle) defer DeleteTestProjectTrigger(t, octopusClient, projectTrigger) @@ -196,25 +154,45 @@ func TestProjectTriggerAddGetUpdateDelete(t *testing.T) { } func TestProjectTriggerGetAll(t *testing.T) { - octopusClient := getOctopusClient() - require.NotNil(t, octopusClient) + octopusClient, project, _, _ := SetupClientAndProjectAndLifecycleAndProjectGroup(t) + projectTriggers, err := triggers.GetAll(octopusClient, project.SpaceID) + require.NoError(t, err) + require.NotNil(t, projectTriggers) +} - space := GetDefaultSpace(t, octopusClient) - require.NotNil(t, space) +func TestProjectWebhookRunbookTrigger(t *testing.T) { - lifecycle := CreateTestLifecycle(t, octopusClient) - require.NotNil(t, lifecycle) - defer DeleteTestLifecycle(t, octopusClient, lifecycle) + octopusClient, project, lifecycle, projectGroup := SetupClientAndProjectAndLifecycleAndProjectGroup(t) - projectGroup := CreateTestProjectGroup(t, octopusClient) - require.NotNil(t, projectGroup) - defer DeleteTestProjectGroup(t, octopusClient, projectGroup) + environment := CreateTestEnvironment(t, octopusClient) + require.NotNil(t, environment) + defer DeleteTestEnvironment(t, octopusClient, environment) - project := CreateTestProject(t, octopusClient, space, lifecycle, projectGroup) - require.NotNil(t, project) - defer DeleteTestProject(t, octopusClient, project) + runbook := CreateTestRunbook(t, octopusClient, lifecycle, projectGroup, project) + require.NotNil(t, runbook) + defer DeleteTestRunbook(t, octopusClient, runbook) - projectTriggers, err := octopusClient.ProjectTriggers.GetAll() + action := actions.NewRunRunbookAction() + action.Runbook = runbook.GetID() + action.Environments = []string{environment.GetID()} + + password := getShortRandomName() + secret := core.SensitiveValue{HasValue: true, NewValue: &password} + + filter := filters.NewWebhookTriggerFilter(secret) + + projectTrigger := triggers.NewProjectTrigger(internal.GetRandomName(), internal.GetRandomName(), createRandomBoolean(), project, action, filter) + require.NotNil(t, projectTrigger) + require.NoError(t, projectTrigger.Validate()) + + createdProjectTrigger, err := triggers.Add(octopusClient, projectTrigger) require.NoError(t, err) - require.NotNil(t, projectTriggers) + require.NotNil(t, createdProjectTrigger) + require.NotEmpty(t, createdProjectTrigger.GetID()) + + // verify the add operation was successful + projectTriggerToCompare, err := triggers.GetById(octopusClient, project.SpaceID, createdProjectTrigger.GetID()) + require.NoError(t, err) + require.NotNil(t, projectTriggerToCompare) + AssertEqualProjectTriggers(t, createdProjectTrigger, projectTriggerToCompare) } From 1b748df56db043b3b187fd1cf2b40d3010b5745f Mon Sep 17 00:00:00 2001 From: Rose Northey Date: Tue, 21 Apr 2026 13:30:40 +1200 Subject: [PATCH 9/9] add skipping if feature toggle is not present and enabled --- test/e2e/project_trigger_test.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/test/e2e/project_trigger_test.go b/test/e2e/project_trigger_test.go index b01d0702..51175c9e 100644 --- a/test/e2e/project_trigger_test.go +++ b/test/e2e/project_trigger_test.go @@ -7,6 +7,7 @@ import ( "github.com/OctopusDeploy/go-octopusdeploy/v2/internal" "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/actions" "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/client" + "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/configuration" "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/core" "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/filters" "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/lifecycles" @@ -115,6 +116,7 @@ func UpdateTestProjectTrigger(t *testing.T, client *client.Client, projectTrigge func SetupClientAndProjectAndLifecycleAndProjectGroup(t *testing.T) (*client.Client, *projects.Project, *lifecycles.Lifecycle, *projectgroups.ProjectGroup) { + octopusClient := getOctopusClient() require.NotNil(t, octopusClient) @@ -164,6 +166,16 @@ func TestProjectWebhookRunbookTrigger(t *testing.T) { octopusClient, project, lifecycle, projectGroup := SetupClientAndProjectAndLifecycleAndProjectGroup(t) + //feature toggle must be present and enabled to run this test, otherwise skip it + webhookTriggersFeatureToggle, err := configuration.Get(octopusClient, &configuration.FeatureToggleConfigurationQuery{Name: "webhook-triggers"}) + if err != nil { + t.Skip("Could not get feature toggle configuration") + } else if len(webhookTriggersFeatureToggle.FeatureToggles) == 0 { + t.Skip("WebhookTriggers feature toggle is not present") + } else if webhookTriggersFeatureToggle.FeatureToggles[0].IsEnabled == false { + t.Skip("WebhookTriggers feature toggle is not enabled") + } + environment := CreateTestEnvironment(t, octopusClient) require.NotNil(t, environment) defer DeleteTestEnvironment(t, octopusClient, environment)