-
Notifications
You must be signed in to change notification settings - Fork 13
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* Implement Component Types * add changie * fix lint
- Loading branch information
1 parent
f3956e3
commit 751db02
Showing
5 changed files
with
665 additions
and
401 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
kind: Feature | ||
body: Add ability to CRUD 'ComponentType' | ||
time: 2025-01-27T15:00:03.646584-06:00 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,107 @@ | ||
package opslevel | ||
|
||
// ComponentTypeId Information about a particular component type | ||
type ComponentTypeId Identifier | ||
|
||
// ComponentType Information about a particular component type | ||
type ComponentType struct { | ||
ComponentTypeId | ||
Description string // The description of the component type (Optional) | ||
Href string // The relative path to link to the component type (Required) | ||
Icon ComponentTypeIcon // The icon associated with the component type (Required) | ||
IsDefault bool // Whether or not the component type is the default (Required) | ||
Name string // The name of the component type (Required) | ||
Timestamps Timestamps // When the component type was created and updated (Required) | ||
} | ||
|
||
// ComponentTypeIcon The icon for a component type | ||
type ComponentTypeIcon struct { | ||
Color string // The color, represented as a hexcode, for the icon (Optional) | ||
Name string // The name of the icon in Phosphor icons for Vue, e.g. `PhBird`. See https://phosphoricons.com/ for a full list (Optional) | ||
} | ||
|
||
type ComponentTypeConnection struct { | ||
Nodes []ComponentType `json:"nodes"` | ||
PageInfo PageInfo `json:"pageInfo"` | ||
TotalCount int `json:"totalCount" graphql:"-"` | ||
} | ||
|
||
func (client *Client) CreateComponentType(input ComponentTypeInput) (*ComponentType, error) { | ||
var m struct { | ||
Payload struct { | ||
ComponentType ComponentType | ||
Errors []OpsLevelErrors | ||
} `graphql:"componentTypeCreate(input:$input)"` | ||
} | ||
v := PayloadVariables{ | ||
"input": input, | ||
} | ||
err := client.Mutate(&m, v, WithName("ComponentTypeCreate")) | ||
return &m.Payload.ComponentType, HandleErrors(err, m.Payload.Errors) | ||
} | ||
|
||
func (client *Client) GetComponentType(identifier string) (*ComponentType, error) { | ||
var q struct { | ||
Account struct { | ||
ComponentType ComponentType `graphql:"componentType(input: $input)"` | ||
} | ||
} | ||
v := PayloadVariables{ | ||
"input": *NewIdentifier(identifier), | ||
} | ||
err := client.Query(&q, v, WithName("ComponentTypeGet")) | ||
return &q.Account.ComponentType, HandleErrors(err, nil) | ||
} | ||
|
||
func (client *Client) ListComponentTypes(variables *PayloadVariables) (*ComponentTypeConnection, error) { | ||
var q struct { | ||
Account struct { | ||
ComponentTypes ComponentTypeConnection `graphql:"componentTypes(after: $after, first: $first)"` | ||
} | ||
} | ||
if variables == nil { | ||
variables = client.InitialPageVariablesPointer() | ||
} | ||
if err := client.Query(&q, *variables, WithName("ComponentTypeList")); err != nil { | ||
return nil, err | ||
} | ||
for q.Account.ComponentTypes.PageInfo.HasNextPage { | ||
(*variables)["after"] = q.Account.ComponentTypes.PageInfo.End | ||
resp, err := client.ListComponentTypes(variables) | ||
if err != nil { | ||
return nil, err | ||
} | ||
q.Account.ComponentTypes.Nodes = append(q.Account.ComponentTypes.Nodes, resp.Nodes...) | ||
q.Account.ComponentTypes.PageInfo = resp.PageInfo | ||
} | ||
q.Account.ComponentTypes.TotalCount = len(q.Account.ComponentTypes.Nodes) | ||
return &q.Account.ComponentTypes, nil | ||
} | ||
|
||
func (client *Client) UpdateComponentType(identifier string, input ComponentTypeInput) (*ComponentType, error) { | ||
var m struct { | ||
Payload struct { | ||
ComponentType ComponentType | ||
Errors []OpsLevelErrors | ||
} `graphql:"componentTypeUpdate(componentType:$target,input:$input)"` | ||
} | ||
v := PayloadVariables{ | ||
"target": *NewIdentifier(identifier), | ||
"input": input, | ||
} | ||
err := client.Mutate(&m, v, WithName("ComponentTypeUpdate")) | ||
return &m.Payload.ComponentType, HandleErrors(err, m.Payload.Errors) | ||
} | ||
|
||
func (client *Client) DeleteComponentType(identifier string) error { | ||
var d struct { | ||
Payload struct { | ||
Errors []OpsLevelErrors `graphql:"errors"` | ||
} `graphql:"componentTypeDelete(resource:$target)"` | ||
} | ||
v := PayloadVariables{ | ||
"target": *NewIdentifier(identifier), | ||
} | ||
err := client.Mutate(&d, v, WithName("ComponentTypeDelete")) | ||
return HandleErrors(err, d.Payload.Errors) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,113 @@ | ||
package opslevel_test | ||
|
||
import ( | ||
"testing" | ||
|
||
ol "github.com/opslevel/opslevel-go/v2024" | ||
"github.com/rocktavious/autopilot/v2023" | ||
) | ||
|
||
func TestComponentTypeCreate(t *testing.T) { | ||
// Arrange | ||
input := autopilot.Register[ol.ComponentTypeInput]("component_type_create_input", | ||
ol.ComponentTypeInput{ | ||
Alias: ol.RefOf("example"), | ||
Name: ol.RefOf("Example"), | ||
Description: ol.RefOf("Example Description"), | ||
Properties: &[]ol.ComponentTypePropertyDefinitionInput{}, | ||
}) | ||
|
||
testRequest := autopilot.NewTestRequest( | ||
`mutation ComponentTypeCreate($input:ComponentTypeInput!){componentTypeCreate(input:$input){componentType{{ template "component_type_graphql" }},errors{message,path}}}`, | ||
`{"input": {"alias": "example", "name": "Example", "description": "Example Description", "properties": []} }`, | ||
`{"data": {"componentTypeCreate": {"componentType": {{ template "component_type_1_response" }} }}}`, | ||
) | ||
|
||
client := BestTestClient(t, "ComponentType/create", testRequest) | ||
// Act | ||
result, err := client.CreateComponentType(input) | ||
// Assert | ||
autopilot.Ok(t, err) | ||
autopilot.Equals(t, id1, result.Id) | ||
} | ||
|
||
func TestComponentTypeGet(t *testing.T) { | ||
// Arrange | ||
testRequest := autopilot.NewTestRequest( | ||
`query ComponentTypeGet($input:IdentifierInput!){account{componentType(input: $input){{ template "component_type_graphql" }}}}`, | ||
`{"input": { {{ template "id1" }} }}`, | ||
`{"data": {"account": {"componentType": {{ template "component_type_1_response" }} }}}`, | ||
) | ||
|
||
client := BestTestClient(t, "ComponentType/get", testRequest) | ||
// Act | ||
result, err := client.GetComponentType(string(id1)) | ||
// Assert | ||
autopilot.Ok(t, err) | ||
autopilot.Equals(t, id1, result.Id) | ||
} | ||
|
||
func TestComponentTypeList(t *testing.T) { | ||
// Arrange | ||
testRequestOne := autopilot.NewTestRequest( | ||
`query ComponentTypeList($after:String!$first:Int!){account{componentTypes(after: $after, first: $first){nodes{{ template "component_type_graphql" }},pageInfo{hasNextPage,hasPreviousPage,startCursor,endCursor}}}}`, | ||
`{{ template "pagination_initial_query_variables" }}`, | ||
`{ "data": { "account": { "componentTypes": { "nodes": [ {{ template "component_type_1_response" }}, {{ template "component_type_2_response" }} ], {{ template "pagination_initial_pageInfo_response" }} }}}}`, | ||
) | ||
testRequestTwo := autopilot.NewTestRequest( | ||
`query ComponentTypeList($after:String!$first:Int!){account{componentTypes(after: $after, first: $first){nodes{{ template "component_type_graphql" }},pageInfo{hasNextPage,hasPreviousPage,startCursor,endCursor}}}}`, | ||
`{{ template "pagination_second_query_variables" }}`, | ||
`{ "data": { "account": { "componentTypes": { "nodes": [ {{ template "component_type_3_response" }} ], {{ template "pagination_second_pageInfo_response" }} }}}}`, | ||
) | ||
requests := []autopilot.TestRequest{testRequestOne, testRequestTwo} | ||
|
||
client := BestTestClient(t, "ComponentType/list", requests...) | ||
// Act | ||
response, err := client.ListComponentTypes(nil) | ||
result := response.Nodes | ||
// Assert | ||
autopilot.Ok(t, err) | ||
autopilot.Equals(t, 3, response.TotalCount) | ||
autopilot.Equals(t, "Example1", result[0].Name) | ||
autopilot.Equals(t, "Example2", result[1].Name) | ||
autopilot.Equals(t, "Example3", result[2].Name) | ||
} | ||
|
||
func TestComponentTypeUpdate(t *testing.T) { | ||
// Arrange | ||
input := autopilot.Register[ol.ComponentTypeInput]("component_type_update_input", | ||
ol.ComponentTypeInput{ | ||
Alias: ol.RefOf("example"), | ||
Name: ol.RefOf("Example"), | ||
Description: ol.RefOf("Example Description"), | ||
Properties: &[]ol.ComponentTypePropertyDefinitionInput{}, | ||
}) | ||
|
||
testRequest := autopilot.NewTestRequest( | ||
`mutation ComponentTypeUpdate($input:ComponentTypeInput!$target:IdentifierInput!){componentTypeUpdate(componentType:$target,input:$input){componentType{{ template "component_type_graphql" }},errors{message,path}}}`, | ||
`{"input": {"alias": "example", "name": "Example", "description": "Example Description", "properties": []}, "target": { {{ template "id1" }} }}`, | ||
`{"data": {"componentTypeUpdate": {"componentType": {{ template "component_type_1_response" }} }}}`, | ||
) | ||
|
||
client := BestTestClient(t, "ComponentType/update", testRequest) | ||
// Act | ||
result, err := client.UpdateComponentType(string(id1), input) | ||
// Assert | ||
autopilot.Ok(t, err) | ||
autopilot.Equals(t, id1, result.Id) | ||
} | ||
|
||
func TestComponentTypeDelete(t *testing.T) { | ||
// Arrange | ||
testRequest := autopilot.NewTestRequest( | ||
`mutation ComponentTypeDelete($target:IdentifierInput!){componentTypeDelete(resource:$target){errors{message,path}}}`, | ||
`{"target": { {{ template "id1" }} }}`, | ||
`{"data": {"componentTypeDelete": {"errors": [] }}}`, | ||
) | ||
|
||
client := BestTestClient(t, "ComponentType/delete", testRequest) | ||
// Act | ||
err := client.DeleteComponentType(string(id1)) | ||
// Assert | ||
autopilot.Ok(t, err) | ||
} |
Oops, something went wrong.