Skip to content

Commit d0530ea

Browse files
authored
Kr/relationship definitions pt2 (#550)
* Add Get and List for Relationship Definition + tests * update changie * fix lint * fix lint again * i officially hate linting
1 parent 3446dd3 commit d0530ea

4 files changed

Lines changed: 202 additions & 1 deletion

File tree

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
kind: Feature
2-
body: Add client functions to create, update and delete "RelationshipDefinition"'s
2+
body: Add client functions to create, get, list, update and delete "RelationshipDefinition"'s
33
time: 2025-05-15T14:54:37.070312-05:00

clientGQL_test.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,17 +32,29 @@ var (
3232
alias2 = dataTemplater.ParseValue("alias2")
3333
alias3 = dataTemplater.ParseValue("alias3")
3434
alias4 = dataTemplater.ParseValue("alias4")
35+
name1 = "Example 1"
36+
name2 = "Example 2"
37+
38+
_setups []func(m *testing.M)
3539
)
3640

3741
func TestMain(m *testing.M) {
3842
output := zerolog.ConsoleWriter{Out: os.Stderr}
3943
log.Logger = log.Output(output)
4044
flag.Parse()
4145
teardown := autopilot.Setup()
46+
for _, fn := range _setups {
47+
fn(m)
48+
}
4249
defer teardown()
4350
os.Exit(m.Run())
4451
}
4552

53+
// TODO: move this to Autopilot to help with test data preparation
54+
func AddSetup(fn func(m *testing.M)) {
55+
_setups = append(_setups, fn)
56+
}
57+
4658
func Templated(input string) string {
4759
response, err := autopilot.Templater.Use(input)
4860
if err != nil {

relationship.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,50 @@ func (client *Client) CreateRelationshipDefinition(input RelationshipDefinitionI
1616
return &m.Payload.Definition, HandleErrors(err, m.Payload.Errors)
1717
}
1818

19+
func (client *Client) GetRelationshipDefinition(identifier string) (*RelationshipDefinitionType, error) {
20+
var q struct {
21+
Account struct {
22+
Resource RelationshipDefinitionType `graphql:"relationshipDefinition(input: $input)"`
23+
}
24+
}
25+
v := PayloadVariables{
26+
"input": *NewIdentifier(identifier),
27+
}
28+
err := client.Query(&q, v, WithName("RelationshipDefinitionGet"))
29+
return &q.Account.Resource, HandleErrors(err, nil)
30+
}
31+
32+
func (client *Client) ListRelationshipDefinitions(variables *PayloadVariables) (*RelationshipDefinitionConnection, error) {
33+
var q struct {
34+
Account struct {
35+
Resources RelationshipDefinitionConnection `graphql:"relationshipDefinitions(after: $after, first: $first, componentType: $componentType, resource: $resource)"`
36+
}
37+
}
38+
if variables == nil {
39+
variables = client.InitialPageVariablesPointer()
40+
}
41+
if (*variables)["componentType"] == nil {
42+
(*variables)["componentType"] = &IdentifierInput{}
43+
}
44+
if (*variables)["resource"] == nil {
45+
(*variables)["resource"] = NewID("")
46+
}
47+
if err := client.Query(&q, *variables, WithName("RelationshipDefinitionList")); err != nil {
48+
return nil, err
49+
}
50+
if q.Account.Resources.PageInfo.HasNextPage {
51+
(*variables)["after"] = q.Account.Resources.PageInfo.End
52+
resp, err := client.ListRelationshipDefinitions(variables)
53+
if err != nil {
54+
return nil, err
55+
}
56+
q.Account.Resources.Nodes = append(q.Account.Resources.Nodes, resp.Nodes...)
57+
q.Account.Resources.PageInfo = resp.PageInfo
58+
}
59+
q.Account.Resources.TotalCount = len(q.Account.Resources.Nodes)
60+
return &q.Account.Resources, nil
61+
}
62+
1963
func (client *Client) UpdateRelationshipDefinition(identifier string, input RelationshipDefinitionInput) (*RelationshipDefinitionType, error) {
2064
var m struct {
2165
Payload RelationshipDefinitionPayload `graphql:"relationshipDefinitionUpdate(relationshipDefinition: $identifier, input: $input)"`

relationship_test.go

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
package opslevel_test
2+
3+
import (
4+
"testing"
5+
6+
ol "github.com/opslevel/opslevel-go/v2025"
7+
"github.com/rocktavious/autopilot/v2023"
8+
)
9+
10+
var (
11+
input ol.RelationshipDefinitionInput
12+
resp1 ol.RelationshipDefinitionType
13+
resp2 ol.RelationshipDefinitionType
14+
)
15+
16+
func init() {
17+
AddSetup(func(m *testing.M) {
18+
input = autopilot.Register[ol.RelationshipDefinitionInput]("relationship_definition_input",
19+
ol.RelationshipDefinitionInput{
20+
Alias: &alias1,
21+
Name: &name1,
22+
Description: ol.RefOf("Example Description"),
23+
ComponentType: ol.NewIdentifier("example"),
24+
Metadata: &ol.RelationshipDefinitionMetadataInput{
25+
AllowedTypes: []string{"example"},
26+
},
27+
})
28+
resp1 = autopilot.Register[ol.RelationshipDefinitionType]("relationship_definition1_response",
29+
ol.RelationshipDefinitionType{
30+
Id: id1,
31+
Alias: alias1,
32+
Name: name1,
33+
Metadata: ol.RelationshipDefinitionMetadata{
34+
AllowedTypes: []string{"example"},
35+
},
36+
})
37+
resp2 = autopilot.Register[ol.RelationshipDefinitionType]("relationship_definition2_response",
38+
ol.RelationshipDefinitionType{
39+
Id: id2,
40+
Alias: alias2,
41+
Name: name2,
42+
Metadata: ol.RelationshipDefinitionMetadata{
43+
AllowedTypes: []string{"example2", "example3"},
44+
},
45+
})
46+
})
47+
}
48+
49+
func TestRelationshipDefinitionCreate(t *testing.T) {
50+
// Arrange
51+
testRequest := autopilot.NewTestRequest(
52+
`mutation RelationshipDefinitionCreate($input:RelationshipDefinitionInput!){relationshipDefinitionCreate(input: $input){definition{alias,componentType{id,aliases},description,id,metadata{allowedTypes,maxItems,minItems},name},errors{message,path}}}`,
53+
`{"input": {{ template "relationship_definition_input" }} }`,
54+
`{"data": {"relationshipDefinitionCreate": {"definition": {{ template "relationship_definition1_response" }} }}}`,
55+
)
56+
57+
client := BestTestClient(t, "relationship_definition/create", testRequest)
58+
// Act
59+
result, err := client.CreateRelationshipDefinition(input)
60+
// Assert
61+
autopilot.Ok(t, err)
62+
autopilot.Equals(t, resp1.Id, result.Id)
63+
autopilot.Equals(t, resp1.Alias, result.Alias)
64+
autopilot.Equals(t, resp1.Metadata.AllowedTypes, result.Metadata.AllowedTypes)
65+
}
66+
67+
func TestRelationshipDefinitionGet(t *testing.T) {
68+
// Arrange
69+
testRequest := autopilot.NewTestRequest(
70+
`query RelationshipDefinitionGet($input:IdentifierInput!){account{relationshipDefinition(input: $input){alias,componentType{id,aliases},description,id,metadata{allowedTypes,maxItems,minItems},name}}}`,
71+
`{"input": { {{ template "id1" }} }}`,
72+
`{"data": {"account": {"relationshipDefinition": {{ template "relationship_definition1_response" }} }}}`,
73+
)
74+
75+
client := BestTestClient(t, "relationship_definition/get", testRequest)
76+
// Act
77+
result, err := client.GetRelationshipDefinition(string(id1))
78+
// Assert
79+
autopilot.Ok(t, err)
80+
autopilot.Equals(t, resp1.Id, result.Id)
81+
autopilot.Equals(t, resp1.Alias, result.Alias)
82+
autopilot.Equals(t, resp1.Metadata.AllowedTypes, result.Metadata.AllowedTypes)
83+
}
84+
85+
func TestRelationshipDefinitionList(t *testing.T) {
86+
// Arrange
87+
testRequestOne := autopilot.NewTestRequest(
88+
`query RelationshipDefinitionList($after:String!$componentType:IdentifierInput$first:Int!$resource:ID){account{relationshipDefinitions(after: $after, first: $first, componentType: $componentType, resource: $resource){nodes{alias,componentType{id,aliases},description,id,metadata{allowedTypes,maxItems,minItems},name},pageInfo{hasNextPage,hasPreviousPage,startCursor,endCursor}}}}`,
89+
`{ {{ template "first_page_variables" }}, "componentType": null, "resource": null}`,
90+
`{ "data": { "account": { "relationshipDefinitions": { "nodes": [ {{ template "relationship_definition1_response" }} ], {{ template "pagination_initial_pageInfo_response" }} }}}}`,
91+
)
92+
testRequestTwo := autopilot.NewTestRequest(
93+
`query RelationshipDefinitionList($after:String!$componentType:IdentifierInput$first:Int!$resource:ID){account{relationshipDefinitions(after: $after, first: $first, componentType: $componentType, resource: $resource){nodes{alias,componentType{id,aliases},description,id,metadata{allowedTypes,maxItems,minItems},name},pageInfo{hasNextPage,hasPreviousPage,startCursor,endCursor}}}}`,
94+
`{ {{ template "second_page_variables" }}, "componentType": null, "resource": null}`,
95+
`{ "data": { "account": { "relationshipDefinitions": { "nodes": [ {{ template "relationship_definition2_response" }} ], {{ template "pagination_second_pageInfo_response" }} }}}}`,
96+
)
97+
requests := []autopilot.TestRequest{testRequestOne, testRequestTwo}
98+
99+
client := BestTestClient(t, "relationship_definition/list", requests...)
100+
// Act
101+
result, err := client.ListRelationshipDefinitions(nil)
102+
// Assert
103+
autopilot.Ok(t, err)
104+
autopilot.Equals(t, 2, result.TotalCount)
105+
autopilot.Equals(t, resp1.Id, result.Nodes[0].Id)
106+
autopilot.Equals(t, resp1.Alias, result.Nodes[0].Alias)
107+
autopilot.Equals(t, resp1.Metadata.AllowedTypes, result.Nodes[0].Metadata.AllowedTypes)
108+
autopilot.Equals(t, resp2.Id, result.Nodes[1].Id)
109+
autopilot.Equals(t, resp2.Alias, result.Nodes[1].Alias)
110+
autopilot.Equals(t, resp2.Metadata.AllowedTypes, result.Nodes[1].Metadata.AllowedTypes)
111+
}
112+
113+
func TestRelationshipDefinitionUpdate(t *testing.T) {
114+
// Arrange
115+
testRequest := autopilot.NewTestRequest(
116+
`mutation RelationshipDefinitionUpdate($identifier:IdentifierInput$input:RelationshipDefinitionInput!){relationshipDefinitionUpdate(relationshipDefinition: $identifier, input: $input){definition{alias,componentType{id,aliases},description,id,metadata{allowedTypes,maxItems,minItems},name},errors{message,path}}}`,
117+
`{"identifier": { {{ template "id1" }} }, "input": {{ template "relationship_definition_input" }} }`,
118+
`{"data": {"relationshipDefinitionUpdate": {"definition": {{ template "relationship_definition1_response" }} }}}`,
119+
)
120+
121+
client := BestTestClient(t, "relationship_definition/update", testRequest)
122+
// Act
123+
result, err := client.UpdateRelationshipDefinition(string(id1), input)
124+
// Assert
125+
autopilot.Ok(t, err)
126+
autopilot.Equals(t, id1, result.Id)
127+
autopilot.Equals(t, resp1.Id, result.Id)
128+
autopilot.Equals(t, resp1.Alias, result.Alias)
129+
autopilot.Equals(t, resp1.Metadata.AllowedTypes, result.Metadata.AllowedTypes)
130+
}
131+
132+
func TestRelationshipDefinitionDelete(t *testing.T) {
133+
// Arrange
134+
testRequest := autopilot.NewTestRequest(
135+
`mutation RelationshipDefinitionDelete($input:IdentifierInput!){relationshipDefinitionDelete(resource: $input){deletedId,errors{message,path}}}`,
136+
`{"input": { {{ template "id1" }} }}`,
137+
`{"data": {"relationshipDefinitionDelete": {"deletedId": "{{ template "id1_string" }}", "errors": [] }}}`,
138+
)
139+
140+
client := BestTestClient(t, "relationship_definition/delete", testRequest)
141+
// Act
142+
_, err := client.DeleteRelationshipDefinition(string(id1))
143+
// Assert
144+
autopilot.Ok(t, err)
145+
}

0 commit comments

Comments
 (0)