diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index cd4001c..5a29082 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -276,35 +276,64 @@ test-gateway: - job: build-gateway artifacts: true -test-integration: +test-browser-client: stage: test + coverage: /All files[^|]*\|[^|]*\s+([\d\.]+)/ tags: - dev script: - export $(cat context.env | xargs) + - docker login -u $CI_REGISTRY_USER --password $CI_JOB_TOKEN $CI_REGISTRY - - export API_IMAGE=$FLIGHTS_INFO_TEST_IMAGE_NAME - - export TEST_TARGET=INTEGRATION - - docker compose -f flights-domain/docker-compose.yml --env-file $ENV_DEV_FILE down - - docker compose -f flights-domain/docker-compose.yml --env-file $ENV_DEV_FILE pull - - docker compose -f flights-domain/docker-compose.yml --env-file $ENV_DEV_FILE up -d - - - export API_IMAGE=$GATEWAY_TEST_IMAGE_NAME - - export TEST_TARGET=INTEGRATION - - docker compose -f gateway/docker-compose.yml --env-file $ENV_DEV_FILE down - - docker compose -f gateway/docker-compose.yml --env-file $ENV_DEV_FILE pull - - docker compose -f gateway/docker-compose.yml --env-file $ENV_DEV_FILE up -d - - - export API_IMAGE=$USER_MANAGER_TEST_IMAGE_NAME - - export TEST_TARGET=INTEGRATION - - docker compose -f auth-domain/docker-compose.yml --env-file $ENV_DEV_FILE down - - docker compose -f auth-domain/docker-compose.yml --env-file $ENV_DEV_FILE pull - - docker compose -f auth-domain/docker-compose.yml --env-file $ENV_DEV_FILE up -d + - export CLIENT_IMAGE=$BROWSER_CLIENT_TEST_IMAGE_NAME + - docker compose -f browser-domain/docker-compose.yml --env-file $ENV_DEV_FILE down + - docker compose -f browser-domain/docker-compose.yml --env-file $ENV_DEV_FILE pull + - docker compose -f browser-domain/docker-compose.yml --env-file $ENV_DEV_FILE up --abort-on-container-exit + - docker cp fids_browser_client:/app/coverage/cobertura-coverage.xml . + - docker cp fids_browser_client:/app/junit.xml . + artifacts: + when: always + paths: + - cobertura-coverage.xml + reports: + junit: junit.xml + coverage_report: + coverage_format: cobertura + path: cobertura-coverage.xml needs: - - job: test-flights-api - - job: test-auth-api - job: preparation + - job: build-browser + artifacts: true + +test-screen-client: + stage: test + coverage: /All files[^|]*\|[^|]*\s+([\d\.]+)/ + tags: + - dev + script: + - export $(cat context.env | xargs) + + - docker login -u $CI_REGISTRY_USER --password $CI_JOB_TOKEN $CI_REGISTRY + + - export CLIENT_IMAGE=$SCREEN_CLIENT_TEST_IMAGE_NAME + - docker compose -f screen-domain/docker-compose.yml --env-file $ENV_DEV_FILE down + - docker compose -f screen-domain/docker-compose.yml --env-file $ENV_DEV_FILE pull + - docker compose -f screen-domain/docker-compose.yml --env-file $ENV_DEV_FILE up --abort-on-container-exit + - docker cp fids_screens_client:/app/coverage/cobertura-coverage.xml . + - docker cp fids_screens_client:/app/junit.xml . + artifacts: + when: always + paths: + - cobertura-coverage.xml + reports: + junit: junit.xml + coverage_report: + coverage_format: cobertura + path: cobertura-coverage.xml + needs: + - job: preparation + - job: build-browser-client artifacts: true test-browser-integration: @@ -314,13 +343,31 @@ test-browser-integration: script: - export $(cat context.env | xargs) - docker login -u $CI_REGISTRY_USER --password $CI_JOB_TOKEN $CI_REGISTRY + + - export TEST_TARGET=INTEGRATION + + - export API_IMAGE=$FLIGHTS_INFO_TEST_IMAGE_NAME + - docker compose -f flights-domain/docker-compose.yml --env-file $ENV_DEV_FILE down + - docker compose -f flights-domain/docker-compose.yml --env-file $ENV_DEV_FILE pull + - docker compose -f flights-domain/docker-compose.yml --env-file $ENV_DEV_FILE up -d + + - export API_IMAGE=$GATEWAY_TEST_IMAGE_NAME + - docker compose -f gateway/docker-compose.yml --env-file $ENV_DEV_FILE down + - docker compose -f gateway/docker-compose.yml --env-file $ENV_DEV_FILE pull + - docker compose -f gateway/docker-compose.yml --env-file $ENV_DEV_FILE up -d + + - export API_IMAGE=$USER_MANAGER_TEST_IMAGE_NAME + - docker compose -f auth-domain/docker-compose.yml --env-file $ENV_DEV_FILE down + - docker compose -f auth-domain/docker-compose.yml --env-file $ENV_DEV_FILE pull + - docker compose -f auth-domain/docker-compose.yml --env-file $ENV_DEV_FILE up -d - export CLIENT_IMAGE=$BROWSER_CLIENT_TEST_IMAGE_NAME - docker compose -f browser-domain/docker-compose.yml --env-file $ENV_DEV_FILE down - docker compose -f browser-domain/docker-compose.yml --env-file $ENV_DEV_FILE pull - docker compose -f browser-domain/docker-compose.yml --env-file $ENV_DEV_FILE up --abort-on-container-exit needs: - - job: test-integration + - job: test-flights-api + - job: test-auth-api - job: build-browser-client - job: preparation artifacts: true @@ -332,13 +379,31 @@ test-screen-integration: script: - export $(cat context.env | xargs) - docker login -u $CI_REGISTRY_USER --password $CI_JOB_TOKEN $CI_REGISTRY + + - export TEST_TARGET=INTEGRATION + + - export API_IMAGE=$FLIGHTS_INFO_TEST_IMAGE_NAME + - docker compose -f flights-domain/docker-compose.yml --env-file $ENV_DEV_FILE down + - docker compose -f flights-domain/docker-compose.yml --env-file $ENV_DEV_FILE pull + - docker compose -f flights-domain/docker-compose.yml --env-file $ENV_DEV_FILE up -d + + - export API_IMAGE=$GATEWAY_TEST_IMAGE_NAME + - docker compose -f gateway/docker-compose.yml --env-file $ENV_DEV_FILE down + - docker compose -f gateway/docker-compose.yml --env-file $ENV_DEV_FILE pull + - docker compose -f gateway/docker-compose.yml --env-file $ENV_DEV_FILE up -d + + - export API_IMAGE=$USER_MANAGER_TEST_IMAGE_NAME + - docker compose -f auth-domain/docker-compose.yml --env-file $ENV_DEV_FILE down + - docker compose -f auth-domain/docker-compose.yml --env-file $ENV_DEV_FILE pull + - docker compose -f auth-domain/docker-compose.yml --env-file $ENV_DEV_FILE up -d - export CLIENT_IMAGE=$SCREEN_CLIENT_TEST_IMAGE_NAME - docker compose -f screen-domain/docker-compose.yml --env-file $ENV_DEV_FILE down - docker compose -f screen-domain/docker-compose.yml --env-file $ENV_DEV_FILE pull - docker compose -f screen-domain/docker-compose.yml --env-file $ENV_DEV_FILE up --abort-on-container-exit needs: - - job: test-integration + - job: test-flights-api + - job: test-auth-api - job: build-screen-client - job: preparation artifacts: true diff --git a/browser-domain/docker-compose.yml b/browser-domain/docker-compose.yml index 2d28688..9218174 100644 --- a/browser-domain/docker-compose.yml +++ b/browser-domain/docker-compose.yml @@ -7,4 +7,5 @@ services: restart: always environment: - API_HOST=api + - TEST_TARGET=${TEST_TARGET} network_mode: host diff --git a/browser-domain/jest.config.js b/browser-domain/jest.config.js index 2bd3148..51c5591 100644 --- a/browser-domain/jest.config.js +++ b/browser-domain/jest.config.js @@ -2,4 +2,5 @@ module.exports = { preset: "ts-jest", testEnvironment: "jsdom", + coverageReporters: ["html", "text", "text-summary", "cobertura"], }; diff --git a/browser-domain/package-lock.json b/browser-domain/package-lock.json index 0f01c29..ac16c40 100644 --- a/browser-domain/package-lock.json +++ b/browser-domain/package-lock.json @@ -28,6 +28,8 @@ "@types/react-dom": "^18.0.11", "jest": "^28.0.0", "jest-environment-jsdom": "^28.0.0", + "jest-junit": "^16.0.0", + "supertest": "^6.3.3", "ts-jest": "^28.0.0", "typescript": "^4.9.5" } @@ -5703,6 +5705,12 @@ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -5809,6 +5817,12 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, + "node_modules/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "dev": true + }, "node_modules/copy-to-clipboard": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", @@ -6498,6 +6512,16 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dev": true, + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -7716,6 +7740,12 @@ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true + }, "node_modules/fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", @@ -8099,6 +8129,21 @@ "node": ">= 6" } }, + "node_modules/formidable": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz", + "integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==", + "dev": true, + "dependencies": { + "dezalgo": "^1.0.4", + "hexoid": "^1.0.0", + "once": "^1.4.0", + "qs": "^6.11.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -8499,6 +8544,15 @@ "he": "bin/he" } }, + "node_modules/hexoid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/hoopy": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", @@ -10331,6 +10385,33 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, + "node_modules/jest-junit": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-16.0.0.tgz", + "integrity": "sha512-A94mmw6NfJab4Fg/BlvVOUXzXgF0XIH6EmTgJ5NDPp4xoKq0Kr7sErb+4Xs9nZvu58pJojz5RFGpqnZYJTrRfQ==", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4", + "strip-ansi": "^6.0.1", + "uuid": "^8.3.2", + "xml": "^1.0.1" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/jest-junit/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/jest-leak-detector": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz", @@ -16922,6 +17003,85 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/superagent": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.1.2.tgz", + "integrity": "sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==", + "dev": true, + "dependencies": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.4", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^2.1.2", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.11.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">=6.4.0 <13 || >=14" + } + }, + "node_modules/superagent/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/superagent/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/superagent/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/superagent/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/supertest": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.3.tgz", + "integrity": "sha512-EMCG6G8gDu5qEqRQ3JjjPs6+FYT1a7Hv5ApHvtSghmOFJYtsU5S+pSb6Y2EUeCEY3CmEL3mmQ8YWlPOzQomabA==", + "dev": true, + "dependencies": { + "methods": "^1.1.2", + "superagent": "^8.0.5" + }, + "engines": { + "node": ">=6.4.0" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -18575,6 +18735,12 @@ } } }, + "node_modules/xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", + "dev": true + }, "node_modules/xml-name-validator": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", @@ -22672,6 +22838,12 @@ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, "compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -22762,6 +22934,12 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, + "cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "dev": true + }, "copy-to-clipboard": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", @@ -23243,6 +23421,16 @@ } } }, + "dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dev": true, + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, "didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -24155,6 +24343,12 @@ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, + "fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true + }, "fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", @@ -24432,6 +24626,18 @@ "mime-types": "^2.1.12" } }, + "formidable": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz", + "integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==", + "dev": true, + "requires": { + "dezalgo": "^1.0.4", + "hexoid": "^1.0.0", + "once": "^1.4.0", + "qs": "^6.11.0" + } + }, "forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -24703,6 +24909,12 @@ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" }, + "hexoid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", + "dev": true + }, "hoopy": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", @@ -26050,6 +26262,26 @@ } } }, + "jest-junit": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-16.0.0.tgz", + "integrity": "sha512-A94mmw6NfJab4Fg/BlvVOUXzXgF0XIH6EmTgJ5NDPp4xoKq0Kr7sErb+4Xs9nZvu58pJojz5RFGpqnZYJTrRfQ==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "strip-ansi": "^6.0.1", + "uuid": "^8.3.2", + "xml": "^1.0.1" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + } + } + }, "jest-leak-detector": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz", @@ -30698,6 +30930,66 @@ } } }, + "superagent": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.1.2.tgz", + "integrity": "sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==", + "dev": true, + "requires": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.4", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^2.1.2", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.11.0", + "semver": "^7.3.8" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "supertest": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.3.tgz", + "integrity": "sha512-EMCG6G8gDu5qEqRQ3JjjPs6+FYT1a7Hv5ApHvtSghmOFJYtsU5S+pSb6Y2EUeCEY3CmEL3mmQ8YWlPOzQomabA==", + "dev": true, + "requires": { + "methods": "^1.1.2", + "superagent": "^8.0.5" + } + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -31940,6 +32232,12 @@ "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", "requires": {} }, + "xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", + "dev": true + }, "xml-name-validator": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", diff --git a/browser-domain/package.json b/browser-domain/package.json index 54d4b01..33db8ad 100644 --- a/browser-domain/package.json +++ b/browser-domain/package.json @@ -1,5 +1,5 @@ { - "name": "sample-client-users", + "name": "browser-client", "version": "0.1.0", "private": true, "dependencies": { @@ -16,11 +16,9 @@ "scripts": { "start": "react-scripts start", "build": "react-scripts build", - "test": "jest --coverage --collectCoverageFrom=\"./src/**\"", - "test:integration": "jest integration", - "eject": "react-scripts eject", - "docker:build": "docker build -t client-users .", - "docker:run": " docker run --rm -it -p 8080:80 client-users" + "test": "jest --testPathPattern=test.tsx --coverage --collectCoverageFrom=\"./src/**\" --reporters=default --reporters=jest-junit", + "test:integration": "jest integration --testPathPattern=src/tests/integration", + "eject": "react-scripts eject" }, "eslintConfig": { "extends": [ @@ -50,6 +48,8 @@ "@types/react-dom": "^18.0.11", "jest": "^28.0.0", "jest-environment-jsdom": "^28.0.0", + "jest-junit": "^16.0.0", + "supertest": "^6.3.3", "ts-jest": "^28.0.0", "typescript": "^4.9.5" } diff --git a/browser-domain/src/tests/integration/flights.spec.js b/browser-domain/src/tests/integration/flights.spec.js new file mode 100644 index 0000000..c9b21c1 --- /dev/null +++ b/browser-domain/src/tests/integration/flights.spec.js @@ -0,0 +1,77 @@ +const request = require('supertest'); +const app = 'http://127.0.0.1:5000' + +const authCredentials = { + email: 'info@lufthansa.com', + password: 'password1234', +}; + +describe('Flight API Endpoints', () => { + let authToken; + + beforeAll(async () => { + const loginResponse = await request(app) + .post('/auth/login') + .send(authCredentials); + + expect(loginResponse.statusCode).toBe(200); + expect(loginResponse.body).toHaveProperty('access_token'); + authToken = loginResponse.body.access_token; + }); + + it('should create a new flight', async () => { + const newFlight = { + "flight_code": "ABC127", + "status": "En ruta", + "origin": "Frankfurt", + "destination": "Ciudad A", + "departure_time": "2023-10-29 09:57 PM", + "arrival_time": "2023-10-30 12:00 PM", + "gate": "A2" + }; + + const response = await request(app) + .post('/flights') + .send(newFlight) + .set('Authorization', `Bearer ${authToken}`); + + expect(response.statusCode).toBe(200); + expect(response.body).toHaveProperty('id'); + createdFlightId = response.body.id; + }); + + it('should retrieve the created flight by ID', async () => { + const response = await request(app) + .get(`/flights/${createdFlightId}`) + .set('Authorization', `Bearer ${authToken}`); + + expect(response.statusCode).toBe(200); + expect(response.body).toHaveProperty('id', createdFlightId); + }); + + it('should update a flight by ID', async () => { + const flightUpdate = { + "status": "Delayed" + }; + + const response = await request(app) + .patch(`/flights/${createdFlightId}`) + .send(flightUpdate) + .set('Authorization', `Bearer ${authToken}`); + + expect(response.statusCode).toBe(200); + expect(response.body).toHaveProperty('id'); + expect(response.body.status).toBe('Delayed'); + }); + + it('should retrieve filtered flights', async () => { + const response = await request(app) + .get('/flights') + .query({ origin: 'Frankfurt' }) + .set('Authorization', `Bearer ${authToken}`); + + expect(response.statusCode).toBe(200); + expect(response.body).toBeInstanceOf(Array); + expect(response.body[0].id).toBe(createdFlightId) + }); +}); \ No newline at end of file diff --git a/browser-domain/test.sh b/browser-domain/test.sh index 24ce9ab..57664cd 100644 --- a/browser-domain/test.sh +++ b/browser-domain/test.sh @@ -1,3 +1,7 @@ #!/bin/bash -npm run test +if [ "${TEST_TARGET:-}" = "INTEGRATION" ]; then + npm run test:integration +else + npm run test +fi diff --git a/run.sh b/run.sh index c4b191b..d02b1b5 100755 --- a/run.sh +++ b/run.sh @@ -110,13 +110,13 @@ elif [ -n "$domain" ] && [ -z "$down" ]; then fi ;; 'screen') - docker build screen-domain -f screen-domain/Dockerfile.prod --build-arg "REACT_APP_ORIGIN=$REACT_APP_ORIGIN" -t $USER/screen-client:prod - export CLIENT_IMAGE=$USER/screen-client:prod + docker build screen-domain -f screen-domain/Dockerfile.test --build-arg "REACT_APP_ORIGIN=$REACT_APP_ORIGIN" -t $USER/screen-client:test + export CLIENT_IMAGE=$USER/screen-client:test docker compose -f screen-domain/docker-compose.yml up -d ;; 'browser') - docker build browser-domain -f browser-domain/Dockerfile.prod -t $USER/browser-client:prod - export CLIENT_IMAGE=$USER/browser-client:prod + docker build browser-domain -f browser-domain/Dockerfile.test -t $USER/browser-client:test + export CLIENT_IMAGE=$USER/browser-client:test docker compose -f browser-domain/docker-compose.yml up -d ;; *) exit 1 ;; @@ -167,4 +167,4 @@ else docker compose -f screen-domain/docker-compose.yml up -d export CLIENT_IMAGE=$USER/browser-client:prod docker compose -f browser-domain/docker-compose.yml up -d -fi \ No newline at end of file +fi diff --git a/screen-domain/docker-compose.yml b/screen-domain/docker-compose.yml index a0ff045..9a288b3 100644 --- a/screen-domain/docker-compose.yml +++ b/screen-domain/docker-compose.yml @@ -7,4 +7,5 @@ services: restart: always environment: - API_HOST=api + - TEST_TARGET=${TEST_TARGET} network_mode: host diff --git a/screen-domain/jest.config.js b/screen-domain/jest.config.js index 2bd3148..51c5591 100644 --- a/screen-domain/jest.config.js +++ b/screen-domain/jest.config.js @@ -2,4 +2,5 @@ module.exports = { preset: "ts-jest", testEnvironment: "jsdom", + coverageReporters: ["html", "text", "text-summary", "cobertura"], }; diff --git a/screen-domain/package-lock.json b/screen-domain/package-lock.json index fe35f91..9470f99 100644 --- a/screen-domain/package-lock.json +++ b/screen-domain/package-lock.json @@ -29,6 +29,7 @@ "jest": "^28.0.0", "jest-environment-jsdom": "^28.0.0", "jest-junit": "^16.0.0", + "supertest": "^6.3.3", "ts-jest": "^28.0.0", "typescript": "^4.9.5" } @@ -5704,6 +5705,12 @@ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -5810,6 +5817,12 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, + "node_modules/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "dev": true + }, "node_modules/copy-to-clipboard": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", @@ -6499,6 +6512,16 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dev": true, + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -7717,6 +7740,12 @@ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true + }, "node_modules/fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", @@ -8100,6 +8129,21 @@ "node": ">= 6" } }, + "node_modules/formidable": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz", + "integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==", + "dev": true, + "dependencies": { + "dezalgo": "^1.0.4", + "hexoid": "^1.0.0", + "once": "^1.4.0", + "qs": "^6.11.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -8500,6 +8544,15 @@ "he": "bin/he" } }, + "node_modules/hexoid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/hoopy": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", @@ -16958,6 +17011,85 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/superagent": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.1.2.tgz", + "integrity": "sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==", + "dev": true, + "dependencies": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.4", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^2.1.2", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.11.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">=6.4.0 <13 || >=14" + } + }, + "node_modules/superagent/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/superagent/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/superagent/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/superagent/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/supertest": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.3.tgz", + "integrity": "sha512-EMCG6G8gDu5qEqRQ3JjjPs6+FYT1a7Hv5ApHvtSghmOFJYtsU5S+pSb6Y2EUeCEY3CmEL3mmQ8YWlPOzQomabA==", + "dev": true, + "dependencies": { + "methods": "^1.1.2", + "superagent": "^8.0.5" + }, + "engines": { + "node": ">=6.4.0" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -22714,6 +22846,12 @@ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, "compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -22804,6 +22942,12 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, + "cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "dev": true + }, "copy-to-clipboard": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", @@ -23285,6 +23429,16 @@ } } }, + "dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dev": true, + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, "didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -24197,6 +24351,12 @@ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, + "fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true + }, "fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", @@ -24474,6 +24634,18 @@ "mime-types": "^2.1.12" } }, + "formidable": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz", + "integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==", + "dev": true, + "requires": { + "dezalgo": "^1.0.4", + "hexoid": "^1.0.0", + "once": "^1.4.0", + "qs": "^6.11.0" + } + }, "forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -24745,6 +24917,12 @@ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" }, + "hexoid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", + "dev": true + }, "hoopy": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", @@ -30761,6 +30939,66 @@ } } }, + "superagent": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.1.2.tgz", + "integrity": "sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==", + "dev": true, + "requires": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.4", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^2.1.2", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.11.0", + "semver": "^7.3.8" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "supertest": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.3.tgz", + "integrity": "sha512-EMCG6G8gDu5qEqRQ3JjjPs6+FYT1a7Hv5ApHvtSghmOFJYtsU5S+pSb6Y2EUeCEY3CmEL3mmQ8YWlPOzQomabA==", + "dev": true, + "requires": { + "methods": "^1.1.2", + "superagent": "^8.0.5" + } + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", diff --git a/screen-domain/package.json b/screen-domain/package.json index b716302..736d181 100644 --- a/screen-domain/package.json +++ b/screen-domain/package.json @@ -1,5 +1,5 @@ { - "name": "sample-client-users", + "name": "screen-client", "version": "0.1.0", "private": true, "dependencies": { @@ -16,11 +16,9 @@ "scripts": { "start": "react-scripts start", "build": "react-scripts build", - "test": "jest --coverage --collectCoverageFrom=\"./src/**\" --reporters=jest-junit", - "test:integration": "jest integration", - "eject": "react-scripts eject", - "docker:build": "docker build -t client-users .", - "docker:run": " docker run --rm -it -p 8080:80 client-users" + "test": "jest --testPathPattern=test.tsx --coverage --collectCoverageFrom=\"./src/**\" --reporters=default --reporters=jest-junit", + "test:integration": "jest integration --testPathPattern=src/tests/integration", + "eject": "react-scripts eject" }, "eslintConfig": { "extends": [ @@ -51,6 +49,7 @@ "jest": "^28.0.0", "jest-environment-jsdom": "^28.0.0", "jest-junit": "^16.0.0", + "supertest": "^6.3.3", "ts-jest": "^28.0.0", "typescript": "^4.9.5" } diff --git a/screen-domain/src/tests/integration/flights.spec.js b/screen-domain/src/tests/integration/flights.spec.js new file mode 100644 index 0000000..c9b21c1 --- /dev/null +++ b/screen-domain/src/tests/integration/flights.spec.js @@ -0,0 +1,77 @@ +const request = require('supertest'); +const app = 'http://127.0.0.1:5000' + +const authCredentials = { + email: 'info@lufthansa.com', + password: 'password1234', +}; + +describe('Flight API Endpoints', () => { + let authToken; + + beforeAll(async () => { + const loginResponse = await request(app) + .post('/auth/login') + .send(authCredentials); + + expect(loginResponse.statusCode).toBe(200); + expect(loginResponse.body).toHaveProperty('access_token'); + authToken = loginResponse.body.access_token; + }); + + it('should create a new flight', async () => { + const newFlight = { + "flight_code": "ABC127", + "status": "En ruta", + "origin": "Frankfurt", + "destination": "Ciudad A", + "departure_time": "2023-10-29 09:57 PM", + "arrival_time": "2023-10-30 12:00 PM", + "gate": "A2" + }; + + const response = await request(app) + .post('/flights') + .send(newFlight) + .set('Authorization', `Bearer ${authToken}`); + + expect(response.statusCode).toBe(200); + expect(response.body).toHaveProperty('id'); + createdFlightId = response.body.id; + }); + + it('should retrieve the created flight by ID', async () => { + const response = await request(app) + .get(`/flights/${createdFlightId}`) + .set('Authorization', `Bearer ${authToken}`); + + expect(response.statusCode).toBe(200); + expect(response.body).toHaveProperty('id', createdFlightId); + }); + + it('should update a flight by ID', async () => { + const flightUpdate = { + "status": "Delayed" + }; + + const response = await request(app) + .patch(`/flights/${createdFlightId}`) + .send(flightUpdate) + .set('Authorization', `Bearer ${authToken}`); + + expect(response.statusCode).toBe(200); + expect(response.body).toHaveProperty('id'); + expect(response.body.status).toBe('Delayed'); + }); + + it('should retrieve filtered flights', async () => { + const response = await request(app) + .get('/flights') + .query({ origin: 'Frankfurt' }) + .set('Authorization', `Bearer ${authToken}`); + + expect(response.statusCode).toBe(200); + expect(response.body).toBeInstanceOf(Array); + expect(response.body[0].id).toBe(createdFlightId) + }); +}); \ No newline at end of file diff --git a/screen-domain/test.sh b/screen-domain/test.sh index 24ce9ab..57664cd 100644 --- a/screen-domain/test.sh +++ b/screen-domain/test.sh @@ -1,3 +1,7 @@ #!/bin/bash -npm run test +if [ "${TEST_TARGET:-}" = "INTEGRATION" ]; then + npm run test:integration +else + npm run test +fi