Skip to content

Commit 61e226f

Browse files
APP-4230 - Add E2E test for --skip-unassigned flag
Two subtests covering auto-promotion behavior: - Success: source repo mapped to DEV -> version promoted to DEV - Mismatch: source repo mapped only to PROD -> version stays unassigned with message explaining the repo_mismatch Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent 998e7c7 commit 61e226f

2 files changed

Lines changed: 93 additions & 2 deletions

File tree

apptrust/commands/version/create_app_version_cmd_test.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,6 @@ func TestCreateAppVersionCommand_FlagsSuite(t *testing.T) {
139139
ctx.Arguments = []string{"app-key", "1.0.0"}
140140
ctx.AddStringFlag(commands.TagFlag, "release-tag")
141141
ctx.AddBoolFlag(commands.DraftFlag, true)
142-
ctx.AddBoolFlag(commands.SkipUnassignedFlag, true)
143142
ctx.AddStringFlag(commands.SourceTypeBuildsFlag, "name=build1,id=1.0.0,include-deps=true,repo-key=build-info-repo,started=2024-01-15T10:30:00Z;name=build2,id=2.0.0,include-deps=false")
144143
ctx.AddStringFlag(commands.SourceTypeReleaseBundlesFlag, "name=rb1,version=1.0.0;name=rb2,version=2.0.0")
145144
ctx.AddStringFlag(commands.SourceTypeApplicationVersionsFlag, "application-key=source-app,version=3.2.1")
@@ -151,7 +150,6 @@ func TestCreateAppVersionCommand_FlagsSuite(t *testing.T) {
151150
Version: "1.0.0",
152151
Tag: "release-tag",
153152
Draft: true,
154-
SkipUnassigned: true,
155153
Sources: &model.CreateVersionSources{
156154
Builds: []model.CreateVersionBuild{
157155
{Name: "build1", Number: "1.0.0", IncludeDependencies: true, RepositoryKey: "build-info-repo", Started: "2024-01-15T10:30:00Z"},

e2e/version_test.go

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33
package e2e
44

55
import (
6+
"bytes"
67
"encoding/json"
78
"fmt"
89
"net/http"
10+
"os"
911
"strings"
1012
"testing"
1113
"time"
@@ -196,6 +198,97 @@ func TestCreateVersion_Draft(t *testing.T) {
196198
assert.Equal(t, utils.StatusDraft, versionContent.Status)
197199
}
198200

201+
func TestCreateVersion_SkipUnassigned(t *testing.T) {
202+
appKey := utils.GenerateUniqueKey("app-version-skip-unassigned")
203+
utils.CreateBasicApplication(t, appKey)
204+
defer utils.DeleteApplication(t, appKey)
205+
206+
testPackage := utils.GetTestPackage(t)
207+
208+
t.Run("auto-promotes when source repo is mapped to first stage", func(t *testing.T) {
209+
version := utils.GenerateUniqueKey("skip-ua-ok")
210+
211+
packageFlag := fmt.Sprintf("--source-type-packages=type=%s, name=%s, version=%s, repo-key=%s",
212+
testPackage.PackageType, testPackage.PackageName, testPackage.PackageVersion, testPackage.RepoKey)
213+
output := utils.AppTrustCli.RunCliCmdWithOutput(t, "version-create", appKey, version, packageFlag, "--skip-unassigned")
214+
defer utils.DeleteApplicationVersion(t, appKey, version)
215+
216+
require.NotEmpty(t, output)
217+
218+
var response struct {
219+
ApplicationKey string `json:"application_key"`
220+
Version string `json:"version"`
221+
Status string `json:"status"`
222+
CurrentStage string `json:"current_stage"`
223+
}
224+
err := json.Unmarshal([]byte(output), &response)
225+
require.NoError(t, err, "failed to parse CLI output as JSON: %s", output)
226+
assert.Equal(t, appKey, response.ApplicationKey)
227+
assert.Equal(t, version, response.Version)
228+
229+
versionContent, statusCode, err := utils.GetApplicationVersion(appKey, version)
230+
require.NoError(t, err)
231+
assert.Equal(t, http.StatusOK, statusCode)
232+
require.NotNil(t, versionContent)
233+
assert.Equal(t, utils.StatusCompleted, versionContent.Status)
234+
assert.Equal(t, "DEV", versionContent.CurrentStage, "Version should be auto-promoted to DEV stage")
235+
})
236+
237+
t.Run("stays unassigned with message when artifact not in first stage", func(t *testing.T) {
238+
version := utils.GenerateUniqueKey("skip-ua-fail")
239+
240+
baseURL := os.Getenv("JFROG_APPTRUST_CLI_TESTS_JFROG_URL")
241+
token := os.Getenv("JFROG_APPTRUST_CLI_TESTS_JFROG_ACCESS_TOKEN")
242+
projectKey := utils.GetTestProjectKey(t)
243+
repoKey := projectKey + "-prod-only-local"
244+
245+
repoPayload := fmt.Sprintf(`{"key":"%s","rclass":"local","packageType":"generic","environments":["PROD"],"projectKey":"%s"}`, repoKey, projectKey)
246+
req, err := http.NewRequest(http.MethodPut, baseURL+"artifactory/api/repositories/"+repoKey, bytes.NewBufferString(repoPayload))
247+
require.NoError(t, err)
248+
req.Header.Set("Content-Type", "application/json")
249+
req.Header.Set("Authorization", "Bearer "+token)
250+
resp, err := http.DefaultClient.Do(req)
251+
require.NoError(t, err)
252+
resp.Body.Close()
253+
require.True(t, resp.StatusCode >= 200 && resp.StatusCode < 300, "Failed to create PROD-only repo: %d", resp.StatusCode)
254+
t.Cleanup(func() {
255+
delReq, _ := http.NewRequest(http.MethodDelete, baseURL+"artifactory/api/repositories/"+repoKey, nil)
256+
delReq.Header.Set("Authorization", "Bearer "+token)
257+
delResp, _ := http.DefaultClient.Do(delReq)
258+
if delResp != nil {
259+
delResp.Body.Close()
260+
}
261+
})
262+
263+
artifactPath := repoKey + "/mismatch-artifact.txt"
264+
uploadReq, err := http.NewRequest(http.MethodPut, baseURL+"artifactory/"+artifactPath, bytes.NewBufferString("mismatch-content"))
265+
require.NoError(t, err)
266+
uploadReq.Header.Set("Authorization", "Bearer "+token)
267+
uploadResp, err := http.DefaultClient.Do(uploadReq)
268+
require.NoError(t, err)
269+
uploadResp.Body.Close()
270+
require.True(t, uploadResp.StatusCode >= 200 && uploadResp.StatusCode < 300, "Failed to upload artifact: %d", uploadResp.StatusCode)
271+
272+
artifactFlag := fmt.Sprintf("--source-type-artifacts=path=%s", artifactPath)
273+
output := utils.AppTrustCli.RunCliCmdWithOutput(t, "version-create", appKey, version, artifactFlag, "--skip-unassigned")
274+
defer utils.DeleteApplicationVersion(t, appKey, version)
275+
276+
require.NotEmpty(t, output)
277+
278+
var response struct {
279+
ApplicationKey string `json:"application_key"`
280+
Version string `json:"version"`
281+
Status string `json:"status"`
282+
Message string `json:"message"`
283+
}
284+
err = json.Unmarshal([]byte(output), &response)
285+
require.NoError(t, err, "failed to parse CLI output as JSON: %s", output)
286+
assert.Equal(t, appKey, response.ApplicationKey)
287+
assert.Equal(t, version, response.Version)
288+
assert.NotEmpty(t, response.Message, "A message should explain why auto-promotion did not occur")
289+
})
290+
}
291+
199292
func TestCreateVersion_Async(t *testing.T) {
200293
appKey := utils.GenerateUniqueKey("app-version-create-async")
201294
utils.CreateBasicApplication(t, appKey)

0 commit comments

Comments
 (0)