Skip to content

Commit 7877f45

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 7877f45

2 files changed

Lines changed: 171 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: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,77 @@
1+
{{- define "campaign_fields" }}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{{ end }}
2+
3+
{{- define "campaign_get_request" }}
4+
query CampaignGet($id:ID!){account{campaign(id: $id){{{ template "campaign_fields" }}}}}
5+
{{ end }}
6+
7+
{{- define "campaign_get_request_vars" }}
8+
{"id":"{{ template "id1_string" }}"}
9+
{{ end }}
10+
11+
{{- define "campaign_get_response" }}{
12+
"data":{"account":{"campaign":{{ template "campaign1_response" }}}}
13+
}{{ end }}
14+
15+
{{- define "campaign_create_request" }}
16+
mutation CampaignCreate($input:CampaignCreateInput!){campaignCreate(input: $input){campaign{{{ template "campaign_fields" }}},errors{message,path}}}
17+
{{ end }}
18+
19+
{{- define "campaign_create_request_vars" }}
20+
{"input":{"name":"New Campaign","ownerId":"{{ template "id1_string" }}"}}
21+
{{ end }}
22+
23+
{{- define "campaign_create_response" }}{
24+
"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":[]}}
25+
}{{ end }}
26+
27+
{{- define "campaign_update_request" }}
28+
mutation CampaignUpdate($input:CampaignUpdateInput!){campaignUpdate(input: $input){campaign{{{ template "campaign_fields" }}},errors{message,path}}}
29+
{{ end }}
30+
31+
{{- define "campaign_update_request_vars" }}
32+
{"input":{"id":"{{ template "id1_string" }}","name":"Updated Campaign","ownerId":"{{ template "id2_string" }}"}}
33+
{{ end }}
34+
35+
{{- define "campaign_update_response" }}{
36+
"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":[]}}
37+
}{{ end }}
38+
39+
{{- define "campaign_delete_request" }}
40+
mutation CampaignDelete($input:DeleteInput!){campaignDelete(input: $input){deletedCampaignId,errors{message,path}}}
41+
{{ end }}
42+
43+
{{- define "campaign_delete_request_vars" }}
44+
{"input":{"id":"{{ template "id1_string" }}"}}
45+
{{ end }}
46+
47+
{{- define "campaign_delete_response" }}{
48+
"data":{"campaignDelete":{"deletedCampaignId":"{{ template "id1_string" }}","errors":[]}}
49+
}{{ end }}
50+
51+
{{- define "campaign_schedule_request" }}
52+
mutation CampaignScheduleUpdate($input:CampaignScheduleUpdateInput!){campaignScheduleUpdate(input: $input){campaign{{{ template "campaign_fields" }}},errors{message,path}}}
53+
{{ end }}
54+
55+
{{- define "campaign_schedule_request_vars" }}
56+
{"input":{"id":"{{ template "id1_string" }}","startDate":"2026-07-01T00:00:00Z","targetDate":"2026-09-30T00:00:00Z"}}
57+
{{ end }}
58+
59+
{{- define "campaign_schedule_response" }}{
60+
"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":[]}}
61+
}{{ end }}
62+
63+
{{- define "campaign_unschedule_request" }}
64+
mutation CampaignUnschedule($input:CampaignUnscheduleInput!){campaignUnschedule(input: $input){campaign{{{ template "campaign_fields" }}},errors{message,path}}}
65+
{{ end }}
66+
67+
{{- define "campaign_unschedule_request_vars" }}
68+
{"input":{"id":"{{ template "id1_string" }}"}}
69+
{{ end }}
70+
71+
{{- define "campaign_unschedule_response" }}{
72+
"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":[]}}
73+
}{{ end }}
74+
175
{{- define "campaign1_response" }}
276
{
377
{{ template "id1" }},

0 commit comments

Comments
 (0)