Skip to content

Commit 98775ac

Browse files
authored
Fit TF tests
1 parent b5dd7ea commit 98775ac

File tree

1 file changed

+94
-118
lines changed

1 file changed

+94
-118
lines changed

tests/integration/api_packages_terraform_test.go

Lines changed: 94 additions & 118 deletions
Original file line numberDiff line numberDiff line change
@@ -4,151 +4,127 @@
44
package integration
55

66
import (
7-
"archive/tar"
87
"bytes"
9-
"compress/gzip"
108
"fmt"
9+
"io"
1110
"net/http"
1211
"strings"
1312
"testing"
1413

15-
auth_model "code.gitea.io/gitea/models/auth"
16-
"code.gitea.io/gitea/models/db"
17-
"code.gitea.io/gitea/models/packages"
14+
"code.gitea.io/gitea/models/auth"
1815
"code.gitea.io/gitea/models/unittest"
1916
user_model "code.gitea.io/gitea/models/user"
2017
"code.gitea.io/gitea/modules/json"
21-
terraform_module "code.gitea.io/gitea/modules/packages/terraform"
2218
"code.gitea.io/gitea/tests"
2319

20+
gouuid "github.com/google/uuid"
2421
"github.com/stretchr/testify/assert"
22+
"github.com/stretchr/testify/require"
2523
)
2624

2725
func TestPackageTerraform(t *testing.T) {
2826
defer tests.PrepareTestEnv(t)()
2927
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
3028

31-
token := "Bearer " + getUserToken(t, user.Name, auth_model.AccessTokenScopeWritePackage)
32-
33-
packageName := "test_module"
34-
packageVersion := "1.0.1"
35-
packageDescription := "Test Terraform Module"
36-
37-
filename := "terraform_module.tar.gz"
38-
39-
infoContent, _ := json.Marshal(map[string]string{
40-
"description": packageDescription,
41-
})
42-
43-
var buf bytes.Buffer
44-
zw := gzip.NewWriter(&buf)
45-
archive := tar.NewWriter(zw)
46-
archive.WriteHeader(&tar.Header{
47-
Name: "info.json",
48-
Mode: 0o600,
49-
Size: int64(len(infoContent)),
50-
})
51-
archive.Write(infoContent)
52-
archive.Close()
53-
zw.Close()
54-
content := buf.Bytes()
55-
56-
root := fmt.Sprintf("/api/packages/%s/terraform", user.Name)
57-
58-
t.Run("Authenticate", func(t *testing.T) {
59-
defer tests.PrintCurrentTest(t)()
60-
61-
authenticateURL := fmt.Sprintf("%s/authenticate", root)
62-
63-
req := NewRequest(t, "GET", authenticateURL)
64-
MakeRequest(t, req, http.StatusUnauthorized)
65-
66-
req = NewRequest(t, "GET", authenticateURL).
67-
AddTokenAuth(token)
68-
MakeRequest(t, req, http.StatusOK)
69-
})
70-
71-
moduleURL := fmt.Sprintf("%s/%s", root, packageName)
72-
29+
// Get token for the user
30+
token := "Bearer " + getUserToken(t, user.Name, auth.AccessTokenScopeWritePackage)
31+
32+
// Define important values
33+
lineage := "bca3c5f6-01dc-cdad-5310-d1b12e02e430"
34+
terraformVersion := "1.10.4"
35+
serial := float64(1)
36+
resourceName := "hello"
37+
resourceType := "null_resource"
38+
id := gouuid.New().String() // Generate a unique ID
39+
40+
// Build the state JSON
41+
buildState := func() string {
42+
return `{
43+
"version": 4,
44+
"terraform_version": "` + terraformVersion + `",
45+
"serial": ` + fmt.Sprintf("%.0f", serial) + `,
46+
"lineage": "` + lineage + `",
47+
"outputs": {},
48+
"resources": [{
49+
"mode": "managed",
50+
"type": "` + resourceType + `",
51+
"name": "` + resourceName + `",
52+
"provider": "provider[\"registry.terraform.io/hashicorp/null\"]",
53+
"instances": [{
54+
"schema_version": 0,
55+
"attributes": {
56+
"id": "3832416504545530133",
57+
"triggers": null
58+
},
59+
"sensitive_attributes": []
60+
}]
61+
}],
62+
"check_results": null
63+
}`
64+
}
65+
state := buildState()
66+
content := []byte(state)
67+
root := fmt.Sprintf("/api/packages/%s/terraform/state", user.Name)
68+
stateURL := fmt.Sprintf("%s/providers-gitea.tfstate", root)
69+
70+
// Upload test
7371
t.Run("Upload", func(t *testing.T) {
74-
defer tests.PrintCurrentTest(t)()
75-
76-
req := NewRequest(t, "HEAD", moduleURL)
77-
MakeRequest(t, req, http.StatusNotFound)
78-
79-
uploadURL := fmt.Sprintf("%s/%s/%s", moduleURL, packageVersion, filename)
80-
81-
req = NewRequestWithBody(t, "PUT", uploadURL, bytes.NewReader(content))
82-
MakeRequest(t, req, http.StatusUnauthorized)
83-
84-
req = NewRequestWithBody(t, "PUT", uploadURL, bytes.NewReader(content)).
85-
AddTokenAuth(token)
86-
MakeRequest(t, req, http.StatusCreated)
87-
88-
req = NewRequest(t, "HEAD", moduleURL)
89-
resp := MakeRequest(t, req, http.StatusOK)
90-
assert.True(t, strings.HasPrefix(resp.Header().Get("Content-Type"), "application/json"))
91-
92-
pvs, err := packages.GetVersionsByPackageType(db.DefaultContext, user.ID, packages.TypeTerraform)
93-
assert.NoError(t, err)
94-
assert.Len(t, pvs, 1)
95-
96-
pd, err := packages.GetPackageDescriptor(db.DefaultContext, pvs[0])
97-
assert.NoError(t, err)
98-
assert.NotNil(t, pd.SemVer)
99-
assert.IsType(t, &terraform_module.Metadata{}, pd.Metadata)
100-
assert.Equal(t, packageName, pd.Package.Name)
101-
assert.Equal(t, packageVersion, pd.Version.Version)
102-
103-
pfs, err := packages.GetFilesByVersionID(db.DefaultContext, pvs[0].ID)
104-
assert.NoError(t, err)
105-
assert.Len(t, pfs, 1)
106-
assert.Equal(t, filename, pfs[0].Name)
107-
assert.True(t, pfs[0].IsLead)
108-
109-
pb, err := packages.GetBlobByID(db.DefaultContext, pfs[0].BlobID)
110-
assert.NoError(t, err)
111-
assert.Equal(t, int64(len(content)), pb.Size)
112-
113-
req = NewRequestWithBody(t, "PUT", uploadURL, bytes.NewReader(content)).
114-
AddTokenAuth(token)
115-
MakeRequest(t, req, http.StatusConflict)
72+
uploadURL := fmt.Sprintf("%s?ID=%s", stateURL, id)
73+
req := NewRequestWithBody(t, "POST", uploadURL, bytes.NewReader(content)).AddTokenAuth(token)
74+
resp := MakeRequest(t, req, http.StatusOK) // Expecting 200 OK
75+
assert.Equal(t, http.StatusOK, resp.Code)
76+
assert.Contains(t, resp.Header().Get("Content-Type"), "application/json")
77+
bodyBytes, err := io.ReadAll(resp.Body)
78+
require.NoError(t, err)
79+
require.NotEmpty(t, bodyBytes)
11680
})
11781

82+
// Download test
11883
t.Run("Download", func(t *testing.T) {
119-
defer tests.PrintCurrentTest(t)()
120-
121-
req := NewRequest(t, "GET", fmt.Sprintf("%s/%s/%s", moduleURL, packageVersion, filename))
84+
downloadURL := fmt.Sprintf("%s?ID=%s", stateURL, id)
85+
req := NewRequest(t, "GET", downloadURL)
12286
resp := MakeRequest(t, req, http.StatusOK)
87+
assert.True(t, strings.HasPrefix(resp.Header().Get("Content-Type"), "application/json"))
12388

124-
assert.Equal(t, content, resp.Body.Bytes())
89+
bodyBytes, err := io.ReadAll(resp.Body)
90+
require.NoError(t, err)
91+
require.NotEmpty(t, bodyBytes)
92+
93+
var jsonResponse map[string]any
94+
err = json.Unmarshal(bodyBytes, &jsonResponse)
95+
require.NoError(t, err)
96+
97+
// Validate the response
98+
assert.Equal(t, lineage, jsonResponse["lineage"])
99+
assert.Equal(t, terraformVersion, jsonResponse["terraform_version"])
100+
assert.Equal(t, serial, jsonResponse["serial"])
101+
resource := jsonResponse["resources"].([]any)[0].(map[string]any)
102+
assert.Equal(t, resourceName, resource["name"])
103+
assert.Equal(t, resourceType, resource["type"])
104+
assert.NotContains(t, resource, "sensitive_attributes")
125105
})
126106

127-
t.Run("EnumeratePackageVersions", func(t *testing.T) {
128-
defer tests.PrintCurrentTest(t)()
107+
// Lock state test
108+
t.Run("LockState", func(t *testing.T) {
109+
lockURL := fmt.Sprintf("%s/lock?ID=%s", stateURL, id)
110+
req := NewRequestWithBody(t, "POST", lockURL, bytes.NewReader(content)).AddTokenAuth(token)
111+
resp := MakeRequest(t, req, http.StatusOK) // Expecting 200 OK
112+
assert.Equal(t, http.StatusOK, resp.Code)
113+
})
129114

130-
req := NewRequest(t, "GET", moduleURL)
131-
resp := MakeRequest(t, req, http.StatusOK)
115+
// Unlock state test
116+
t.Run("UnlockState", func(t *testing.T) {
117+
unlockURL := fmt.Sprintf("%s/lock?ID=%s", stateURL, id)
118+
req := NewRequestWithBody(t, "DELETE", unlockURL, bytes.NewReader(content)).AddTokenAuth(token)
119+
resp := MakeRequest(t, req, http.StatusOK) // Expecting 200 OK
120+
assert.Equal(t, http.StatusOK, resp.Code)
121+
})
132122

133-
type versionMetadata struct {
134-
Version string `json:"version"`
135-
Status string `json:"status"`
136-
}
137-
138-
type packageMetadata struct {
139-
Name string `json:"name"`
140-
Description string `json:"description,omitempty"`
141-
Versions []*versionMetadata `json:"versions"`
142-
}
143-
144-
var result packageMetadata
145-
DecodeJSON(t, resp, &result)
146-
147-
assert.Equal(t, packageName, result.Name)
148-
assert.Equal(t, packageDescription, result.Description)
149-
assert.Len(t, result.Versions, 1)
150-
version := result.Versions[0]
151-
assert.Equal(t, packageVersion, version.Version)
152-
assert.Equal(t, "active", version.Status)
123+
// Download not found test
124+
t.Run("DownloadNotFound", func(t *testing.T) {
125+
invalidStateURL := fmt.Sprintf("%s/invalid-state.tfstate?ID=%s", root, id)
126+
req := NewRequest(t, "GET", invalidStateURL)
127+
resp := MakeRequest(t, req, http.StatusNoContent) // Expecting 204 No Content
128+
assert.Equal(t, http.StatusNoContent, resp.Code)
153129
})
154130
}

0 commit comments

Comments
 (0)