Skip to content

Commit e46a5d6

Browse files
arrestledleehr
andauthored
Reduce technical debt of code duplication in automated tests (#69)
* makefile refactor for help. Cleanup. Seeing a panic * group host inventory job test refactoring lint * refactoring: group host inventory job test. Makefile Adjustments * remove changes to client.go and other review comments. Co-authored-by: Dan Leehr <[email protected]> --------- Co-authored-by: Dan Leehr <[email protected]>
1 parent 6468ff6 commit e46a5d6

File tree

10 files changed

+183
-122
lines changed

10 files changed

+183
-122
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,5 @@ config.tfrc
3838

3939
.env
4040
.DS_Store
41+
.tools
42+
.vscode

Makefile

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,33 @@
1+
include makefiles/golangci.mk
2+
13
.PHONY: build test lint
24

5+
36
default: build
47

5-
build:
8+
build: ## Compile the Go package. This is the default.
69
@echo "==> Building package..."
710
go build
811

9-
lint:
10-
@echo "==> Checking source code against linters..."
11-
golangci-lint run -v ./...
12+
clean: ## Remove the .tools folder and binaries.
13+
@rm -rf .tools
14+
@rm terraform-provider-aap
1215

13-
test:
16+
test: ## Execute all unit tests with verbose output.
1417
@echo "==> Running unit tests..."
1518
go test -v ./...
1619

17-
testacc:
18-
@echo "==> Running acceptance tests..."
19-
TF_ACC=1 AAP_HOST="https://localhost:8043" AAP_INSECURE_SKIP_VERIFY=true go test -count=1 -v ./...
20-
21-
testacc-aapdev:
20+
testacc: ## Run Acceptance tests against aap instance (See README.md for env variables)
2221
@echo "==> Running acceptance tests..."
23-
TF_ACC=1 AAP_HOST="http://localhost:9080" go test -count=1 -v ./...
24-
25-
gofmt:
26-
@echo "==> Format code using gofmt..."
27-
gofmt -s -w internal/provider
22+
TF_ACC=1 go test -count=1 -v ./...
2823

29-
generatedocs:
24+
generatedocs: ## Format example Terraform configurations and generate plugin documentation.
3025
@echo "==> Formatting examples and generating docs..."
3126
terraform fmt -recursive ./examples/
3227
go run github.com/hashicorp/terraform-plugin-docs/cmd/tfplugindocs generate
28+
29+
.PHONY: help
30+
help: ## Show this help message
31+
@grep -hE '^[a-zA-Z0-9._-]+:.*?##' $(MAKEFILE_LIST) | \
32+
awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-16s\033[0m %s\n", $$1, $$2}' | \
33+
sort

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,13 @@ Acceptance tests apply test terraform configurations to a running AAP instance a
4444

4545
To run acceptance tests locally, start a local AAP instance following the [docker-compose instructions for local AWX development](https://github.com/ansible/awx/blob/devel/tools/docker-compose/README.md). Create an admin user for the AAP instance and save the credentials to these environment variables:
4646

47+
Create an admin user for the AAP instance and set the following environment variables:
48+
4749
```bash
4850
export AAP_USERNAME=<your admin username>
4951
export AAP_PASSWORD=<your admin password>
52+
export AAP_INSECURE_SKIP_VERIFY=true
53+
export AAP_HOST=<your aap instance host url> # "http://localhost:9080" or "https://localhost:8043"
5054
```
5155

5256
In order to run the acceptance tests for the job resource, you must have a working job template already in your AAP instance. The job template must be set to require an inventory on launch. Export the id of this job template:

internal/provider/group_resource_test.go

Lines changed: 35 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import (
66
"encoding/json"
77
"fmt"
88
"reflect"
9-
"regexp"
109
"strings"
1110
"testing"
1211

@@ -35,14 +34,13 @@ func TestGroupResourceSchema(t *testing.T) {
3534

3635
// Validate the schema
3736
diagnostics := schemaResponse.Schema.ValidateImplementation(ctx)
38-
3937
if diagnostics.HasError() {
4038
t.Fatalf("Schema validation diagnostics: %+v", diagnostics)
4139
}
4240
}
4341

4442
func TestGroupResourceCreateRequestBody(t *testing.T) {
45-
var testTable = []struct {
43+
testCases := []struct {
4644
name string
4745
input GroupResourceModel
4846
expected []byte
@@ -97,14 +95,14 @@ func TestGroupResourceCreateRequestBody(t *testing.T) {
9795
},
9896
}
9997

100-
for _, test := range testTable {
101-
t.Run(test.name, func(t *testing.T) {
102-
actual, diags := test.input.CreateRequestBody()
98+
for _, testCase := range testCases {
99+
t.Run(testCase.name, func(t *testing.T) {
100+
actual, diags := testCase.input.CreateRequestBody()
103101
if diags.HasError() {
104102
t.Fatal(diags.Errors())
105103
}
106-
if !bytes.Equal(test.expected, actual) {
107-
t.Errorf("Expected (%s) not equal to actual (%s)", test.expected, actual)
104+
if !bytes.Equal(testCase.expected, actual) {
105+
t.Errorf("Expected (%s) not equal to actual (%s)", testCase.expected, actual)
108106
}
109107
})
110108
}
@@ -114,7 +112,15 @@ func TestGroupResourceParseHttpResponse(t *testing.T) {
114112
jsonError := diag.Diagnostics{}
115113
jsonError.AddError("Error parsing JSON response from AAP", "invalid character 'N' looking for beginning of value")
116114

117-
var testTable = []struct {
115+
const groupJSON = `{
116+
"inventory": 1,
117+
"description": "A basic test group",
118+
"name": "group1",
119+
"url": "/api/v2/groups/1/",
120+
"variables": "{\"foo\":\"bar\",\"nested\":{\"foobar\":\"baz\"}}"
121+
}`
122+
123+
testCases := []struct {
118124
name string
119125
input []byte
120126
expected GroupResourceModel
@@ -139,9 +145,8 @@ func TestGroupResourceParseHttpResponse(t *testing.T) {
139145
errors: diag.Diagnostics{},
140146
},
141147
{
142-
name: "test with all values",
143-
input: []byte(`{"inventory":1,"description":"A basic test group","name":"group1","url":"/api/v2/groups/1/",` +
144-
`"variables":"{\"foo\":\"bar\",\"nested\":{\"foobar\":\"baz\"}}"}`),
148+
name: "test with all values",
149+
input: []byte(groupJSON),
145150
expected: GroupResourceModel{
146151
InventoryId: types.Int64Value(1),
147152
Id: types.Int64Value(0),
@@ -154,15 +159,15 @@ func TestGroupResourceParseHttpResponse(t *testing.T) {
154159
},
155160
}
156161

157-
for _, test := range testTable {
158-
t.Run(test.name, func(t *testing.T) {
162+
for _, testCase := range testCases {
163+
t.Run(testCase.name, func(t *testing.T) {
159164
resource := GroupResourceModel{}
160-
diags := resource.ParseHttpResponse(test.input)
161-
if !test.errors.Equal(diags) {
162-
t.Errorf("Expected error diagnostics (%s), actual was (%s)", test.errors, diags)
165+
diags := resource.ParseHttpResponse(testCase.input)
166+
if !testCase.errors.Equal(diags) {
167+
t.Errorf("Expected error diagnostics (%s), actual was (%s)", testCase.errors, diags)
163168
}
164-
if !reflect.DeepEqual(test.expected, resource) {
165-
t.Errorf("Expected (%s) not equal to actual (%s)", test.expected, resource)
169+
if !reflect.DeepEqual(testCase.expected, resource) {
170+
t.Errorf("Expected (%s) not equal to actual (%s)", testCase.expected, resource)
166171
}
167172
})
168173
}
@@ -172,42 +177,38 @@ func TestGroupResourceParseHttpResponse(t *testing.T) {
172177

173178
func TestAccGroupResource(t *testing.T) {
174179
var groupApiModel GroupAPIModel
175-
var description = "A test group"
176-
var variables = "{\"foo\": \"bar\"}"
177180
inventoryName := acctest.RandStringFromCharSet(10, acctest.CharSetAlphaNum)
178181
groupName := acctest.RandStringFromCharSet(10, acctest.CharSetAlphaNum)
179182
updatedName := "updated" + groupName
183+
description := "A test group"
184+
variables := "{\"foo\": \"bar\"}"
180185

181186
resource.Test(t, resource.TestCase{
182187
PreCheck: func() { testAccPreCheck(t) },
183188
ProtoV6ProviderFactories: testAccProtoV6ProviderFactories,
184189
Steps: []resource.TestStep{
185-
// Invalid variables testing
190+
// Invalid variables testing.
186191
{
187192
Config: testAccGroupResourceBadVariables(inventoryName, updatedName),
188-
ExpectError: regexp.MustCompile("Input type `str` is not a dictionary"),
193+
ExpectError: reInvalidVars,
189194
},
190-
// Create and Read testing
191195
{
192196
Config: testAccGroupResourceMinimal(inventoryName, groupName),
193197
Check: resource.ComposeAggregateTestCheckFunc(
194-
testAccCheckGroupResourceExists("aap_group.test", &groupApiModel),
198+
testAccCheckGroupResourceExists(resourceNameGroup, &groupApiModel),
195199
testAccCheckGroupResourceValues(&groupApiModel, groupName, "", ""),
196-
resource.TestCheckResourceAttr("aap_group.test", "name", groupName),
197-
resource.TestCheckResourceAttrPair("aap_group.test", "inventory_id", "aap_inventory.test", "id"),
198-
resource.TestMatchResourceAttr("aap_group.test", "url", regexp.MustCompile("^/api(/controller)?/v2/groups/[0-9]*/$")),
200+
checkBasicGroupAttributes(t, resourceNameGroup, groupName),
199201
),
200202
},
201203
{
202204
Config: testAccGroupResourceComplete(inventoryName, updatedName),
203205
Check: resource.ComposeAggregateTestCheckFunc(
204-
testAccCheckGroupResourceExists("aap_group.test", &groupApiModel),
206+
testAccCheckGroupResourceExists(resourceNameGroup, &groupApiModel),
205207
testAccCheckGroupResourceValues(&groupApiModel, updatedName, description, variables),
206-
resource.TestCheckResourceAttr("aap_group.test", "name", updatedName),
207-
resource.TestCheckResourceAttrPair("aap_group.test", "inventory_id", "aap_inventory.test", "id"),
208-
resource.TestCheckResourceAttr("aap_group.test", "description", description),
209-
resource.TestCheckResourceAttr("aap_group.test", "variables", variables),
210-
resource.TestMatchResourceAttr("aap_group.test", "url", regexp.MustCompile("^/api(/controller)?/v2/groups/[0-9]*/$")),
208+
checkBasicGroupAttributes(t, resourceNameGroup, updatedName),
209+
resource.TestCheckResourceAttr(resourceNameGroup, "name", updatedName),
210+
resource.TestCheckResourceAttr(resourceNameGroup, "description", description),
211+
resource.TestCheckResourceAttr(resourceNameGroup, "variables", variables),
211212
),
212213
},
213214
},

internal/provider/host_resource_test.go

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -277,28 +277,20 @@ func TestAccHostResource(t *testing.T) {
277277
{
278278
Config: testAccHostResourceMinimal(inventoryName, hostName),
279279
Check: resource.ComposeAggregateTestCheckFunc(
280-
testAccCheckHostResourceExists("aap_host.test", &hostApiModel),
280+
checkBasicHostAttributes(t, resourceNameHost, hostName),
281+
testAccCheckHostResourceExists(resourceNameHost, &hostApiModel),
281282
testAccCheckHostResourceValues(&hostApiModel, hostName, "", ""),
282-
resource.TestCheckResourceAttr("aap_host.test", "name", hostName),
283-
resource.TestCheckResourceAttrPair("aap_host.test", "inventory_id", "aap_inventory.test", "id"),
284-
resource.TestCheckResourceAttr("aap_host.test", "enabled", "true"),
285-
resource.TestMatchResourceAttr("aap_host.test", "url", regexp.MustCompile("^/api(/controller)?/v2/hosts/[0-9]*/$")),
286-
resource.TestCheckResourceAttrSet("aap_host.test", "id"),
287283
),
288284
},
289285
// Update and Read testing
290286
{
291287
Config: testAccHostResourceComplete(inventoryName, groupName, updatedName),
292288
Check: resource.ComposeAggregateTestCheckFunc(
293-
testAccCheckHostResourceExists("aap_host.test", &hostApiModel),
289+
testAccCheckHostResourceExists(resourceNameHost, &hostApiModel),
294290
testAccCheckHostResourceValues(&hostApiModel, updatedName, updatedDescription, updatedVariables),
295-
resource.TestCheckResourceAttr("aap_host.test", "name", updatedName),
296-
resource.TestCheckResourceAttrPair("aap_host.test", "inventory_id", "aap_inventory.test", "id"),
297-
resource.TestCheckResourceAttr("aap_host.test", "description", updatedDescription),
298-
resource.TestCheckResourceAttr("aap_host.test", "variables", updatedVariables),
299-
resource.TestCheckResourceAttr("aap_host.test", "enabled", "true"),
300-
resource.TestMatchResourceAttr("aap_host.test", "url", regexp.MustCompile("^/api(/controller)?/v2/hosts/[0-9]*/$")),
301-
resource.TestCheckResourceAttrSet("aap_host.test", "id"),
291+
checkBasicHostAttributes(t, resourceNameHost, updatedName),
292+
resource.TestCheckResourceAttr(resourceNameHost, "description", updatedDescription),
293+
resource.TestCheckResourceAttr(resourceNameHost, "variables", updatedVariables),
302294
),
303295
},
304296
},

internal/provider/inventory_data_source_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -110,11 +110,11 @@ func TestAccInventoryDataSource(t *testing.T) {
110110
{
111111
Config: testAccInventoryDataSource(randomName),
112112
Check: resource.ComposeAggregateTestCheckFunc(
113-
resource.TestCheckResourceAttrPair("aap_inventory.test", "name", "data.aap_inventory.test", "name"),
114-
resource.TestCheckResourceAttrPair("aap_inventory.test", "organization", "data.aap_inventory.test", "organization"),
115-
resource.TestCheckResourceAttrPair("aap_inventory.test", "description", "data.aap_inventory.test", "description"),
116-
resource.TestCheckResourceAttrPair("aap_inventory.test", "variables", "data.aap_inventory.test", "variables"),
117-
resource.TestCheckResourceAttrPair("aap_inventory.test", "url", "data.aap_inventory.test", "url"),
113+
resource.TestCheckResourceAttrPair(resourceNameInventory, "name", "data.aap_inventory.test", "name"),
114+
resource.TestCheckResourceAttrPair(resourceNameInventory, "organization", "data.aap_inventory.test", "organization"),
115+
resource.TestCheckResourceAttrPair(resourceNameInventory, "description", "data.aap_inventory.test", "description"),
116+
resource.TestCheckResourceAttrPair(resourceNameInventory, "variables", "data.aap_inventory.test", "variables"),
117+
resource.TestCheckResourceAttrPair(resourceNameInventory, "url", "data.aap_inventory.test", "url"),
118118
),
119119
},
120120
},

internal/provider/inventory_resource_test.go

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -186,29 +186,20 @@ func TestAccInventoryResource(t *testing.T) {
186186
{
187187
Config: testAccInventoryResourceMinimal(randomName),
188188
Check: resource.ComposeAggregateTestCheckFunc(
189-
testAccCheckInventoryResourceExists("aap_inventory.test", &inventory),
189+
testAccCheckInventoryResourceExists(resourceNameInventory, &inventory),
190190
testAccCheckInventoryResourceValues(&inventory, randomName, "", ""),
191-
resource.TestCheckResourceAttr("aap_inventory.test", "name", randomName),
192-
resource.TestCheckResourceAttr("aap_inventory.test", "organization", "1"),
193-
resource.TestCheckResourceAttr("aap_inventory.test", "organization_name", "Default"),
194-
resource.TestCheckResourceAttrSet("aap_inventory.test", "named_url"),
195-
resource.TestCheckResourceAttrSet("aap_inventory.test", "id"),
196-
resource.TestCheckResourceAttrSet("aap_inventory.test", "url"),
191+
checkBasicInventoryAttributes(t, resourceNameInventory, randomName, "1", "Default"),
197192
),
198193
},
199194
// Update and Read testing
200195
{
201196
Config: testAccInventoryResourceComplete(updatedName),
202197
Check: resource.ComposeAggregateTestCheckFunc(
203-
testAccCheckInventoryResourceExists("aap_inventory.test", &inventory),
198+
testAccCheckInventoryResourceExists(resourceNameInventory, &inventory),
204199
testAccCheckInventoryResourceValues(&inventory, updatedName, updatedDescription, updatedVariables),
205-
resource.TestCheckResourceAttr("aap_inventory.test", "name", updatedName),
206-
resource.TestCheckResourceAttr("aap_inventory.test", "organization", "1"),
207-
resource.TestCheckResourceAttr("aap_inventory.test", "description", updatedDescription),
208-
resource.TestCheckResourceAttr("aap_inventory.test", "variables", updatedVariables),
209-
resource.TestCheckResourceAttr("aap_inventory.test", "named_url", fmt.Sprintf("/api/controller/v2/inventories/%s++%s/", updatedName, "Default")),
210-
resource.TestCheckResourceAttrSet("aap_inventory.test", "id"),
211-
resource.TestCheckResourceAttrSet("aap_inventory.test", "url"),
200+
checkBasicInventoryAttributes(t, resourceNameInventory, updatedName, "1", "Default"),
201+
resource.TestCheckResourceAttr(resourceNameInventory, "description", updatedDescription),
202+
resource.TestCheckResourceAttr(resourceNameInventory, "variables", updatedVariables),
212203
),
213204
},
214205
},

0 commit comments

Comments
 (0)