diff --git a/.gitlab/.gitlab-ci.yml b/.gitlab/.gitlab-ci.yml index 4c24508..beaa3cc 100644 --- a/.gitlab/.gitlab-ci.yml +++ b/.gitlab/.gitlab-ci.yml @@ -6,39 +6,71 @@ stages: - Release variables: - ENTRY_FOLDER: "test" + ENTRY_FOLDER: "test" # test directory for testing CI/CD, or assets directory for normal operations RELEASE_VERSION: v0.$CI_PIPELINE_IID PACKAGE_REGISTRY_URL: "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/${PACKAGE_NAME}/${RELEASE_VERSION}" +# TODO: to reenable later # Jobs from here run on Merge Requests as prerequisite for merging. -.gen-manifest-job: &gen-manifest +.manifest-job: &manifest stage: Manifest rules: - if: $CI_PIPELINE_SOURCE == "merge_request_event" changes: # TODO: refacto this (as Reference or something else) - - test/${PACKAGE_NAME}/* + - ${ENTRY_FOLDER}/${PACKAGE_NAME}/* script: - echo generating manifest for ${ENTRY_FOLDER}/${PACKAGE_NAME} -gen-manifest-job/valid_set: - variables: - PACKAGE_NAME: "valid_set" - <<: *gen-manifest +# manifest-job/valid_set: +# variables: +# PACKAGE_NAME: "valid_set" +# <<: *gen-manifest -.check-content-job: &check-content +.test-images-job: &test-images stage: Test + image: python:latest rules: - if: $CI_PIPELINE_SOURCE == "merge_request_event" changes: - ${ENTRY_FOLDER}/${PACKAGE_NAME}/* script: - - echo testing ${ENTRY_FOLDER}/${PACKAGE_NAME} + - pip install -U pytest pillow iteration_utilities + - python -m pytest src/test_images_job/test_wpp.py --tb=line -rA --color=yes --code-highlight=yes -q + allow_failure: true -check-content-job/valid_set: +test-images-job/valid_set: variables: PACKAGE_NAME: "valid_set" - <<: *check-content + <<: *test-images + +test-images-job/missing_tag_set: + variables: + PACKAGE_NAME: "missing_tag_set" + <<: *test-images + +.test-manifest-job: &test-manifest + stage: Test + image: node:latest + rules: + - if: $CI_PIPELINE_SOURCE == "merge_request_event" + changes: + - ${ENTRY_FOLDER}/${PACKAGE_NAME}/* + script: + - cd src/test_manifest_job + - npm install ajv ajv-errors mocha mocha-steps chai + - cd ../.. + - node src/test_manifest_job/node_modules/mocha/bin/_mocha --require mocha-steps --colors src/test_manifest_job/wpp_checker.js + +test-manifest-job/valid_set: + variables: + PACKAGE_NAME: "valid_set" + <<: *test-manifest + +test-manifest-job/missing_tag_set: + variables: + PACKAGE_NAME: "missing_tag_set" + <<: *test-manifest # Jobs from here run Merged_results or Push/Merge Commits to the main branch. Tag is created on release so no run with tag creation .bundle-job: &bundle @@ -63,6 +95,11 @@ bundle-job/valid_set: PACKAGE_NAME: "valid_set" <<: *bundle +bundle-job/missing_tag_set: + variables: + PACKAGE_NAME: "missing_tag_set" + <<: *bundle + .upload-job: &upload stage: Distribute image: curlimages/curl:latest @@ -78,12 +115,19 @@ bundle-job/valid_set: --header "JOB-TOKEN: ${CI_JOB_TOKEN}" \ --upload-file ${PACKAGE_NAME}.zip "${PACKAGE_REGISTRY_URL}/${PACKAGE_NAME}.zip?select=package_file" -# upload-job/valid_set: -# needs: -# - bundle-job/valid_set -# variables: -# PACKAGE_NAME: "valid_set" -# <<: *upload +upload-job/valid_set: + needs: + - bundle-job/valid_set + variables: + PACKAGE_NAME: "valid_set" + <<: *upload + +upload-job/missing_tag_set: + needs: + - bundle-job/missing_tag_set + variables: + PACKAGE_NAME: "missing_tag_set" + <<: *upload .release-job: &release stage: Release @@ -105,9 +149,17 @@ bundle-job/valid_set: links: - name: ${PACKAGE_NAME} url: "${PACKAGE_REGISTRY_URL}/${PACKAGE_NAME}.zip" -# release-job/valid_set: -# needs: -# - upload-job/valid_set -# variables: -# PACKAGE_NAME: "valid_set" -# <<: *release + +release-job/valid_set: + needs: + - upload-job/valid_set + variables: + PACKAGE_NAME: "valid_set" + <<: *release + +release-job/missing_tag_set: + needs: + - upload-job/missing_tag_set + variables: + PACKAGE_NAME: "missing_tag_set" + <<: *release diff --git a/src/test_images_job/test_wpp.py b/src/test_images_job/test_wpp.py index 3bdda88..f12b1fa 100644 --- a/src/test_images_job/test_wpp.py +++ b/src/test_images_job/test_wpp.py @@ -46,8 +46,8 @@ def validate_brightness_image(working_path, theme_config, high_light, image_list @pytest.fixture def working_path(): # get the global variables containing gitlab-given project slug. - project_slug = os.environ["WPP_SLUG"] - root_folder = os.environ["WPP_ROOT"] + project_slug = os.environ["PACKAGE_NAME"] + root_folder = os.environ["ENTRY_FOLDER"] working_path = Path(root_folder, project_slug) if not working_path.is_dir(): raise FileNotFoundError(f"No project found for the given {working_path}.") @@ -76,7 +76,6 @@ def test_image_size(working_path, manifest): assert w >= h, "✖ Image orientation is portrait (must be landscape or square)" # print(f"✔ Images are big enough ({w}×{h}) and landscape.") - def test_overlapping_images(manifest): jointed_lists = manifest.get("dayImageList") jointed_lists.extend(manifest.get("nightImageList")) diff --git a/src/test_manifest_job/wppChecker.js b/src/test_manifest_job/wpp_checker.js similarity index 54% rename from src/test_manifest_job/wppChecker.js rename to src/test_manifest_job/wpp_checker.js index 7fc1364..7421385 100644 --- a/src/test_manifest_job/wppChecker.js +++ b/src/test_manifest_job/wpp_checker.js @@ -3,21 +3,21 @@ const path = require("path"); const { env, exit } = require("process"); const expect = require("chai").expect; const Ajv = require("ajv").default; -const ajv = new Ajv({allErrors: true}); +const ajv = new Ajv({ allErrors: true }); require("ajv-errors")(ajv); //let root, slug; //let workingDirectory = path.join(root, slug); //console.log(`👷‍♂️ Working with ‘${slug}’ slug.`); -const themeSchemaFile = ".gitlab/node_job/json_theme_schema.jsonc"; +const themeSchemaFile = "src/test_manifest_job/json_theme_schema.jsonc"; let wppManifest; let validator; let files; function leftOuterJoin(leftArray, rightArray) { - return leftArray.filter(function(el) { - return this.indexOf(el) < 0; + return leftArray.filter(function (el) { + return this.indexOf(el) < 0; }, rightArray); } @@ -25,7 +25,7 @@ function flatReferences(wppManifest) { allImageIds = [ wppManifest.dayHighlight, wppManifest.nightHighlight, - ...wppManifest.dayImageList, + ...wppManifest.dayImageList, ...wppManifest.nightImageList, ...(wppManifest.sunsetImageList || []), ...(wppManifest.sunriseImageList || []) @@ -35,42 +35,42 @@ function flatReferences(wppManifest) { }); } -describe('Mandatory Checks', function() { - before(function() { - slug = env.WPP_SLUG; +describe('Mandatory Checks', function () { + before(function () { + slug = env.PACKAGE_NAME; expect(slug).to.be.a("string").that.is.not.empty; - root = env.WPP_ROOT; + root = env.ENTRY_FOLDER; expect(root).to.be.a("string").that.is.not.empty; workingDirectory = path.join(root, slug); files = fs.readdirSync(workingDirectory); expect(files).to.be.an('array').that.is.not.empty; validator = ajv.compile(JSON.parse(fs.readFileSync(themeSchemaFile, 'utf8'))); - }); + }); - step('Manifest is an existing json file', function() { + step('Manifest is an existing json file', function () { wppManifest = JSON.parse(fs.readFileSync(path.join(workingDirectory, "theme.json"), "utf8")); }); - step('Manifest passes the schema', function() { + step('Manifest passes the schema', function () { const isValid = validator(wppManifest); - if(!isValid) expect.fail(`\n\t• ${validator.errors.map(el => {return el.message;}).join('\n\t• ')}`); + if (!isValid) expect.fail(`\n\t• ${validator.errors.map(el => { return el.message; }).join('\n\t• ')}`); }); - step('There are no missing files', function() { + step('There are no missing files', function () { let references = flatReferences(wppManifest); references.push("theme.json"); missings = leftOuterJoin(references, files); - expect(missings, - `The following reference${(missings.length > 1)? "s": ""} from theme.json ${(missings.length > 1)? "are": "is"} missing in the pack. Consider adding ${(missings.length > 1)? "them": " it"} to the pack or removing the reference${(missings.length > 1)? "s": ""} from the theme.json:\n\t• ${missings.join('\n\t• ')}\n` - ).to.be.lengthOf(0, ); + expect(missings, + `The following reference${(missings.length > 1) ? "s" : ""} from theme.json ${(missings.length > 1) ? "are" : "is"} missing in the pack. Consider adding ${(missings.length > 1) ? "them" : " it"} to the pack or removing the reference${(missings.length > 1) ? "s" : ""} from the theme.json:\n\t• ${missings.join('\n\t• ')}\n` + ).to.be.lengthOf(0,); }); - step('There are no orphan files', function() { + step('There are no orphan files', function () { let references = flatReferences(wppManifest); orphans = leftOuterJoin(files.filter(x => x !== "theme.json"), references); expect(orphans, - `The following orphan file${(orphans.length > 1)? "s are": " is"} not referenced in this theme.json. Consider removing the file${(orphans.length > 1)? "s": ""} or referencing ${(orphans.length > 1)? "them": "it"} in the theme.json:\n\t• ${orphans.join('\n\t• ')}\n` - ).to.be.lengthOf(0); + `The following orphan file${(orphans.length > 1) ? "s are" : " is"} not referenced in this theme.json. Consider removing the file${(orphans.length > 1) ? "s" : ""} or referencing ${(orphans.length > 1) ? "them" : "it"} in the theme.json:\n\t• ${orphans.join('\n\t• ')}\n` + ).to.be.lengthOf(0); }); }); \ No newline at end of file diff --git a/test/missing_tag_set/bl3_landscape_1.jpg b/test/missing_tag_set/bl3_landscape_1.jpg new file mode 100644 index 0000000..3e48b8b Binary files /dev/null and b/test/missing_tag_set/bl3_landscape_1.jpg differ diff --git a/test/missing_tag_set/bl3_landscape_2.jpg b/test/missing_tag_set/bl3_landscape_2.jpg new file mode 100644 index 0000000..e69683f Binary files /dev/null and b/test/missing_tag_set/bl3_landscape_2.jpg differ diff --git a/test/missing_tag_set/bl3_landscape_3.jpg b/test/missing_tag_set/bl3_landscape_3.jpg new file mode 100644 index 0000000..9fa97bb Binary files /dev/null and b/test/missing_tag_set/bl3_landscape_3.jpg differ diff --git a/test/missing_tag_set/bl3_landscape_4.jpg b/test/missing_tag_set/bl3_landscape_4.jpg new file mode 100644 index 0000000..4c3da38 Binary files /dev/null and b/test/missing_tag_set/bl3_landscape_4.jpg differ diff --git a/test/missing_tag_set/theme.json b/test/missing_tag_set/theme.json new file mode 100644 index 0000000..3add1bb --- /dev/null +++ b/test/missing_tag_set/theme.json @@ -0,0 +1,14 @@ +{ + "imageFilename": "bl3_landscape_*.jpg", + "imageCredits": "© Gearbox", + "displayName": "", + "dayImageList": [ + 2 + ], + "sunsetImageList": [ + 2 + ], + "nightImageList": [ + 3 + ] +} \ No newline at end of file diff --git a/test/valid_set/theme.json b/test/valid_set/theme.json new file mode 100644 index 0000000..24eadf2 --- /dev/null +++ b/test/valid_set/theme.json @@ -0,0 +1,19 @@ +{ + "imageFilename": "bl2_eridum_badlands_*.jpg", + "imageCredits": "Gearbox", + "displayName": "", + "dayHighlight": 1, + "nightHighlight": 3, + "sunriseImageList": [ + 4 + ], + "dayImageList": [ + 1 + ], + "sunsetImageList": [ + 2 + ], + "nightImageList": [ + 3 + ] +} \ No newline at end of file