Skip to content

Commit ea1f16b

Browse files
committed
test: add unit tests for campaign CRUD methods
Add test fixtures and test functions for GetCampaign, CreateCampaign, UpdateCampaign, DeleteCampaign, ScheduleCampaign, and UnscheduleCampaign. Extends campaigns.tpl with reusable GraphQL request/response templates for all mutation operations. Made-with: Cursor
1 parent 55eced3 commit ea1f16b

2 files changed

Lines changed: 169 additions & 0 deletions

File tree

campaign_test.go

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,106 @@ import (
44
"testing"
55

66
ol "github.com/opslevel/opslevel-go/v2026"
7+
"github.com/relvacode/iso8601"
78
"github.com/rocktavious/autopilot/v2023"
89
)
910

11+
func TestCreateCampaign(t *testing.T) {
12+
testRequest := autopilot.NewTestRequest(
13+
`{{ template "campaign_create_request" }}`,
14+
`{{ template "campaign_create_request_vars" }}`,
15+
`{{ template "campaign_create_response" }}`,
16+
)
17+
client := BestTestClient(t, "campaign/create", testRequest)
18+
campaign, err := client.CreateCampaign(ol.CampaignCreateInput{
19+
Name: "New Campaign",
20+
OwnerId: id1,
21+
})
22+
autopilot.Ok(t, err)
23+
autopilot.Equals(t, "New Campaign", campaign.Name)
24+
autopilot.Equals(t, ol.CampaignStatusEnumDraft, campaign.Status)
25+
autopilot.Equals(t, id1, campaign.Owner.Id)
26+
}
27+
28+
func TestGetCampaign(t *testing.T) {
29+
testRequest := autopilot.NewTestRequest(
30+
`{{ template "campaign_get_request" }}`,
31+
`{{ template "campaign_get_request_vars" }}`,
32+
`{{ template "campaign_get_response" }}`,
33+
)
34+
client := BestTestClient(t, "campaign/get", testRequest)
35+
campaign, err := client.GetCampaign(id1)
36+
autopilot.Ok(t, err)
37+
autopilot.Equals(t, id1, campaign.Id)
38+
autopilot.Equals(t, "Campaign 1", campaign.Name)
39+
autopilot.Equals(t, ol.CampaignStatusEnumInProgress, campaign.Status)
40+
autopilot.Equals(t, "2024-01-01 00:00:00 +0000 UTC", campaign.StartDate.String())
41+
autopilot.Equals(t, "#engineering", campaign.Reminder.DefaultSlackChannel)
42+
}
43+
44+
func TestUpdateCampaign(t *testing.T) {
45+
testRequest := autopilot.NewTestRequest(
46+
`{{ template "campaign_update_request" }}`,
47+
`{{ template "campaign_update_request_vars" }}`,
48+
`{{ template "campaign_update_response" }}`,
49+
)
50+
name := "Updated Campaign"
51+
client := BestTestClient(t, "campaign/update", testRequest)
52+
campaign, err := client.UpdateCampaign(ol.CampaignUpdateInput{
53+
Id: id1,
54+
Name: &name,
55+
OwnerId: ol.RefOf(id2),
56+
})
57+
autopilot.Ok(t, err)
58+
autopilot.Equals(t, id1, campaign.Id)
59+
autopilot.Equals(t, "Updated Campaign", campaign.Name)
60+
autopilot.Equals(t, id2, campaign.Owner.Id)
61+
}
62+
63+
func TestDeleteCampaign(t *testing.T) {
64+
testRequest := autopilot.NewTestRequest(
65+
`{{ template "campaign_delete_request" }}`,
66+
`{{ template "campaign_delete_request_vars" }}`,
67+
`{{ template "campaign_delete_response" }}`,
68+
)
69+
client := BestTestClient(t, "campaign/delete", testRequest)
70+
err := client.DeleteCampaign(id1)
71+
autopilot.Ok(t, err)
72+
}
73+
74+
func TestScheduleCampaign(t *testing.T) {
75+
testRequest := autopilot.NewTestRequest(
76+
`{{ template "campaign_schedule_request" }}`,
77+
`{{ template "campaign_schedule_request_vars" }}`,
78+
`{{ template "campaign_schedule_response" }}`,
79+
)
80+
client := BestTestClient(t, "campaign/schedule", testRequest)
81+
startDate, _ := iso8601.ParseString("2026-07-01T00:00:00Z")
82+
targetDate, _ := iso8601.ParseString("2026-09-30T00:00:00Z")
83+
campaign, err := client.ScheduleCampaign(ol.CampaignScheduleUpdateInput{
84+
Id: id1,
85+
StartDate: iso8601.Time{Time: startDate},
86+
TargetDate: iso8601.Time{Time: targetDate},
87+
})
88+
autopilot.Ok(t, err)
89+
autopilot.Equals(t, ol.CampaignStatusEnumScheduled, campaign.Status)
90+
autopilot.Equals(t, "2026-07-01 00:00:00 +0000 UTC", campaign.StartDate.String())
91+
autopilot.Equals(t, "2026-09-30 00:00:00 +0000 UTC", campaign.TargetDate.String())
92+
}
93+
94+
func TestUnscheduleCampaign(t *testing.T) {
95+
testRequest := autopilot.NewTestRequest(
96+
`{{ template "campaign_unschedule_request" }}`,
97+
`{{ template "campaign_unschedule_request_vars" }}`,
98+
`{{ template "campaign_unschedule_response" }}`,
99+
)
100+
client := BestTestClient(t, "campaign/unschedule", testRequest)
101+
campaign, err := client.UnscheduleCampaign(id1)
102+
autopilot.Ok(t, err)
103+
autopilot.Equals(t, ol.CampaignStatusEnumDraft, campaign.Status)
104+
autopilot.Equals(t, true, campaign.StartDate.IsZero())
105+
}
106+
10107
func TestListCampaigns(t *testing.T) {
11108
// Arrange
12109
testRequestOne := autopilot.NewTestRequest(

testdata/templates/campaigns.tpl

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,75 @@
1+
{{- define "campaign_get_request" }}
2+
query CampaignGet($id:ID!){account{campaign(id: $id){checkStats{total,totalSuccessful},endedDate,filter{id,name},htmlUrl,id,name,owner{alias,id},projectBrief,rawProjectBrief,reminder{channels,daysOfWeek,defaultSlackChannel,frequency,frequencyUnit,message,nextOccurrence,timeOfDay,timezone},serviceStats{total,totalSuccessful},startDate,status,targetDate}}}
3+
{{ end }}
4+
5+
{{- define "campaign_get_request_vars" }}
6+
{"id":"{{ template "id1_string" }}"}
7+
{{ end }}
8+
9+
{{- define "campaign_get_response" }}{
10+
"data":{"account":{"campaign":{{ template "campaign1_response" }}}}
11+
}{{ end }}
12+
13+
{{- define "campaign_create_request" }}
14+
mutation CampaignCreate($input:CampaignCreateInput!){campaignCreate(input: $input){campaign{checkStats{total,totalSuccessful},endedDate,filter{id,name},htmlUrl,id,name,owner{alias,id},projectBrief,rawProjectBrief,reminder{channels,daysOfWeek,defaultSlackChannel,frequency,frequencyUnit,message,nextOccurrence,timeOfDay,timezone},serviceStats{total,totalSuccessful},startDate,status,targetDate},errors{message,path}}}
15+
{{ end }}
16+
17+
{{- define "campaign_create_request_vars" }}
18+
{"input":{"name":"New Campaign","ownerId":"{{ template "id1_string" }}"}}
19+
{{ end }}
20+
21+
{{- define "campaign_create_response" }}{
22+
"data":{"campaignCreate":{"campaign":{"checkStats":{"total":0,"totalSuccessful":0},"endedDate":null,"filter":null,"htmlUrl":"https://app.opslevel.com/campaigns/new","id":"{{ template "id1_string" }}","name":"New Campaign","owner":{"alias":"platform","id":"{{ template "id1_string" }}"},"projectBrief":null,"rawProjectBrief":null,"reminder":null,"serviceStats":{"total":0,"totalSuccessful":0},"startDate":null,"status":"draft","targetDate":null},"errors":[]}}
23+
}{{ end }}
24+
25+
{{- define "campaign_update_request" }}
26+
mutation CampaignUpdate($input:CampaignUpdateInput!){campaignUpdate(input: $input){campaign{checkStats{total,totalSuccessful},endedDate,filter{id,name},htmlUrl,id,name,owner{alias,id},projectBrief,rawProjectBrief,reminder{channels,daysOfWeek,defaultSlackChannel,frequency,frequencyUnit,message,nextOccurrence,timeOfDay,timezone},serviceStats{total,totalSuccessful},startDate,status,targetDate},errors{message,path}}}
27+
{{ end }}
28+
29+
{{- define "campaign_update_request_vars" }}
30+
{"input":{"id":"{{ template "id1_string" }}","name":"Updated Campaign","ownerId":"{{ template "id2_string" }}"}}
31+
{{ end }}
32+
33+
{{- define "campaign_update_response" }}{
34+
"data":{"campaignUpdate":{"campaign":{"checkStats":{"total":0,"totalSuccessful":0},"endedDate":null,"filter":null,"htmlUrl":"https://app.opslevel.com/campaigns/updated","id":"{{ template "id1_string" }}","name":"Updated Campaign","owner":{"alias":"security","id":"{{ template "id2_string" }}"},"projectBrief":null,"rawProjectBrief":null,"reminder":null,"serviceStats":{"total":0,"totalSuccessful":0},"startDate":null,"status":"draft","targetDate":null},"errors":[]}}
35+
}{{ end }}
36+
37+
{{- define "campaign_delete_request" }}
38+
mutation CampaignDelete($input:DeleteInput!){campaignDelete(input: $input){deletedCampaignId,errors{message,path}}}
39+
{{ end }}
40+
41+
{{- define "campaign_delete_request_vars" }}
42+
{"input":{"id":"{{ template "id1_string" }}"}}
43+
{{ end }}
44+
45+
{{- define "campaign_delete_response" }}{
46+
"data":{"campaignDelete":{"deletedCampaignId":"{{ template "id1_string" }}","errors":[]}}
47+
}{{ end }}
48+
49+
{{- define "campaign_schedule_request" }}
50+
mutation CampaignScheduleUpdate($input:CampaignScheduleUpdateInput!){campaignScheduleUpdate(input: $input){campaign{checkStats{total,totalSuccessful},endedDate,filter{id,name},htmlUrl,id,name,owner{alias,id},projectBrief,rawProjectBrief,reminder{channels,daysOfWeek,defaultSlackChannel,frequency,frequencyUnit,message,nextOccurrence,timeOfDay,timezone},serviceStats{total,totalSuccessful},startDate,status,targetDate},errors{message,path}}}
51+
{{ end }}
52+
53+
{{- define "campaign_schedule_request_vars" }}
54+
{"input":{"id":"{{ template "id1_string" }}","startDate":"2026-07-01T00:00:00Z","targetDate":"2026-09-30T00:00:00Z"}}
55+
{{ end }}
56+
57+
{{- define "campaign_schedule_response" }}{
58+
"data":{"campaignScheduleUpdate":{"campaign":{"checkStats":{"total":0,"totalSuccessful":0},"endedDate":null,"filter":null,"htmlUrl":"https://app.opslevel.com/campaigns/scheduled","id":"{{ template "id1_string" }}","name":"Scheduled Campaign","owner":{"alias":"platform","id":"{{ template "id1_string" }}"},"projectBrief":null,"rawProjectBrief":null,"reminder":null,"serviceStats":{"total":0,"totalSuccessful":0},"startDate":"2026-07-01T00:00:00Z","status":"scheduled","targetDate":"2026-09-30T00:00:00Z"},"errors":[]}}
59+
}{{ end }}
60+
61+
{{- define "campaign_unschedule_request" }}
62+
mutation CampaignUnschedule($input:CampaignUnscheduleInput!){campaignUnschedule(input: $input){campaign{checkStats{total,totalSuccessful},endedDate,filter{id,name},htmlUrl,id,name,owner{alias,id},projectBrief,rawProjectBrief,reminder{channels,daysOfWeek,defaultSlackChannel,frequency,frequencyUnit,message,nextOccurrence,timeOfDay,timezone},serviceStats{total,totalSuccessful},startDate,status,targetDate},errors{message,path}}}
63+
{{ end }}
64+
65+
{{- define "campaign_unschedule_request_vars" }}
66+
{"input":{"id":"{{ template "id1_string" }}"}}
67+
{{ end }}
68+
69+
{{- define "campaign_unschedule_response" }}{
70+
"data":{"campaignUnschedule":{"campaign":{"checkStats":{"total":0,"totalSuccessful":0},"endedDate":null,"filter":null,"htmlUrl":"https://app.opslevel.com/campaigns/unscheduled","id":"{{ template "id1_string" }}","name":"Unscheduled Campaign","owner":{"alias":"platform","id":"{{ template "id1_string" }}"},"projectBrief":null,"rawProjectBrief":null,"reminder":null,"serviceStats":{"total":0,"totalSuccessful":0},"startDate":null,"status":"draft","targetDate":null},"errors":[]}}
71+
}{{ end }}
72+
173
{{- define "campaign1_response" }}
274
{
375
{{ template "id1" }},

0 commit comments

Comments
 (0)