|
3 | 3 | package e2e |
4 | 4 |
|
5 | 5 | import ( |
| 6 | + "bytes" |
6 | 7 | "encoding/json" |
7 | 8 | "fmt" |
8 | 9 | "net/http" |
| 10 | + "os" |
9 | 11 | "strings" |
10 | 12 | "testing" |
11 | 13 | "time" |
@@ -196,6 +198,97 @@ func TestCreateVersion_Draft(t *testing.T) { |
196 | 198 | assert.Equal(t, utils.StatusDraft, versionContent.Status) |
197 | 199 | } |
198 | 200 |
|
| 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 | + |
199 | 292 | func TestCreateVersion_Async(t *testing.T) { |
200 | 293 | appKey := utils.GenerateUniqueKey("app-version-create-async") |
201 | 294 | utils.CreateBasicApplication(t, appKey) |
|
0 commit comments