From 9e006c531023fecf2dd7500f1373d15f24473dc4 Mon Sep 17 00:00:00 2001 From: alexlee-dev Date: Fri, 21 Aug 2020 07:11:10 -0700 Subject: [PATCH 01/17] =?UTF-8?q?=F0=9F=93=A6=20Bump=20Version=20-=20Bump?= =?UTF-8?q?=20version=20to=20v1.8.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6405a4f..abaecf9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "gh-jobs", - "version": "1.7.0", + "version": "1.8.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 0733e94..be85f10 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gh-jobs", - "version": "1.7.0", + "version": "1.8.0", "description": "A MERN application bootstrapped with create-mern-application.", "main": "build/index.js", "scripts": { From 5e393fd1fe5c1d86f7970dc60ed72497951c3028 Mon Sep 17 00:00:00 2001 From: alexlee-dev Date: Fri, 21 Aug 2020 07:11:47 -0700 Subject: [PATCH 02/17] =?UTF-8?q?=F0=9F=93=9D=20CHANGELOG=20-=20Add=20v1.8?= =?UTF-8?q?.0=20to=20CHANGELOG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d6fe045..83d4cb4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,16 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.8.0] - _Unreleased_ + +### Added + +### Changed + +### Removed + +### Fixed + ## [1.7.0] - 2020-08-20 ### 🐛 Bug Fixeroo Numbah 2 From b854513fd0f5804913b012dac1a577b2fb6a5a77 Mon Sep 17 00:00:00 2001 From: alexlee-dev Date: Fri, 21 Aug 2020 07:24:52 -0700 Subject: [PATCH 03/17] =?UTF-8?q?=F0=9F=91=A9=E2=80=8D=F0=9F=94=AC=20Updat?= =?UTF-8?q?e=20Cypress=20to=20v5.0.0=20#101=20-=20Update=20Cypress?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 287 ++++++++++++++++++++++++++-------------------- package.json | 2 +- 2 files changed, 163 insertions(+), 126 deletions(-) diff --git a/package-lock.json b/package-lock.json index abaecf9..64d0eb3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -345,9 +345,9 @@ } }, "@samverschueren/stream-to-observable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz", - "integrity": "sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.1.tgz", + "integrity": "sha512-c/qwwcHyafOQuVQJj0IlBjf5yYgBI7YPJ77k4fOJYesb41jio65eaJODRUmfYKhTOFBrIZ66kgvGPlNbjuoRdQ==", "dev": true, "requires": { "any-observable": "^0.3.0" @@ -1466,6 +1466,12 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", @@ -1479,9 +1485,9 @@ "dev": true }, "aws4": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", - "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", + "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==", "dev": true }, "axios": { @@ -1635,6 +1641,12 @@ "safe-buffer": "^5.1.1" } }, + "blob-util": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", + "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==", + "dev": true + }, "bluebird": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", @@ -2158,47 +2170,14 @@ } }, "cli-table3": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", - "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.0.tgz", + "integrity": "sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ==", "dev": true, "requires": { "colors": "^1.1.2", "object-assign": "^4.1.0", - "string-width": "^2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } + "string-width": "^4.2.0" } }, "cli-truncate": { @@ -2662,9 +2641,9 @@ "dev": true }, "cypress": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-4.12.1.tgz", - "integrity": "sha512-9SGIPEmqU8vuRA6xst2CMTYd9sCFCxKSzrHt0wr+w2iAQMCIIsXsQ5Gplns1sT6LDbZcmLv6uehabAOl3fhc9Q==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-5.0.0.tgz", + "integrity": "sha512-jhPd0PMO1dPSBNpx6pHVLkmnnaTfMy3wCoacHAKJ9LJG06y16zqUNSFri64N4BjuGe8y6mNMt8TdgKnmy9muCg==", "dev": true, "requires": { "@cypress/listr-verbose-renderer": "^0.4.1", @@ -2673,26 +2652,27 @@ "@types/sinonjs__fake-timers": "^6.0.1", "@types/sizzle": "^2.3.2", "arch": "^2.1.2", + "blob-util": "2.0.2", "bluebird": "^3.7.2", "cachedir": "^2.3.0", - "chalk": "^2.4.2", + "chalk": "^4.1.0", "check-more-types": "^2.24.0", - "cli-table3": "~0.5.1", + "cli-table3": "~0.6.0", "commander": "^4.1.1", "common-tags": "^1.8.0", "debug": "^4.1.1", "eventemitter2": "^6.4.2", - "execa": "^1.0.0", + "execa": "^4.0.2", "executable": "^4.1.1", "extract-zip": "^1.7.0", - "fs-extra": "^8.1.0", + "fs-extra": "^9.0.1", "getos": "^3.2.1", "is-ci": "^2.0.0", "is-installed-globally": "^0.3.2", "lazy-ass": "^1.6.0", "listr": "^0.14.3", "lodash": "^4.17.19", - "log-symbols": "^3.0.0", + "log-symbols": "^4.0.0", "minimist": "^1.2.5", "moment": "^2.27.0", "ospath": "^1.2.2", @@ -2700,7 +2680,7 @@ "ramda": "~0.26.1", "request-progress": "^3.0.0", "supports-color": "^7.1.0", - "tmp": "~0.1.0", + "tmp": "~0.2.1", "untildify": "^4.0.0", "url": "^0.11.0", "yauzl": "^2.10.0" @@ -2712,26 +2692,15 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, "debug": { @@ -2743,12 +2712,89 @@ "ms": "^2.1.1" } }, + "execa": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz", + "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, "supports-color": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", @@ -2756,14 +2802,15 @@ "dev": true, "requires": { "has-flag": "^4.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - } + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" } } } @@ -4217,14 +4264,15 @@ } }, "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", + "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", "dev": true, "requires": { + "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" } }, "fs-write-stream-atomic": { @@ -5360,12 +5408,13 @@ } }, "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", + "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", "dev": true, "requires": { - "graceful-fs": "^4.1.6" + "graceful-fs": "^4.1.6", + "universalify": "^1.0.0" } }, "jsonwebtoken": { @@ -5603,6 +5652,12 @@ "escape-string-regexp": "^1.0.5" } }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, "onetime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", @@ -5702,25 +5757,12 @@ "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=" }, "log-symbols": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", - "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", "dev": true, "requires": { - "chalk": "^2.4.2" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - } + "chalk": "^4.0.0" } }, "log-update": { @@ -5755,6 +5797,12 @@ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, "onetime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", @@ -5963,9 +6011,9 @@ } }, "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, "mini-create-react-context": { @@ -8859,23 +8907,12 @@ "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" }, "tmp": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz", - "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", "dev": true, "requires": { - "rimraf": "^2.6.3" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } + "rimraf": "^3.0.0" } }, "to-arraybuffer": { @@ -9094,9 +9131,9 @@ } }, "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", "dev": true }, "unpipe": { diff --git a/package.json b/package.json index be85f10..4a71c9d 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ "clean-webpack-plugin": "^3.0.0", "copyfiles": "^2.3.0", "css-loader": "^3.6.0", - "cypress": "4.12.1", + "cypress": "5.0.0", "env-cmd": "^10.1.0", "eslint": "^7.4.0", "eslint-plugin-react": "^7.20.3", From 06b58a7e263a1481a97fe530b84dc6320293de2c Mon Sep 17 00:00:00 2001 From: alexlee-dev Date: Fri, 21 Aug 2020 07:48:41 -0700 Subject: [PATCH 04/17] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20Refactor=20Thunks=20?= =?UTF-8?q?#103=20-=20Refactor=20Part=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/Pagination/PaginationItem.tsx | 4 +- src/client/modals/Settings/Settings.tsx | 4 +- src/client/redux/thunks.ts | 170 ++++-------------- 3 files changed, 34 insertions(+), 144 deletions(-) diff --git a/src/client/components/Pagination/PaginationItem.tsx b/src/client/components/Pagination/PaginationItem.tsx index 3007571..118224e 100644 --- a/src/client/components/Pagination/PaginationItem.tsx +++ b/src/client/components/Pagination/PaginationItem.tsx @@ -3,7 +3,7 @@ import { connect } from "react-redux"; import { PaginationListItem } from "./Pagination-styled"; -import { pagination } from "../../redux/thunks"; +import { setCurrentPage } from "../../redux/actions/application"; import { RootState } from "../../types"; @@ -37,7 +37,7 @@ const mapStateToProps = (state: RootState) => ({ const mapDispatchToProps = (dispatch) => ({ handlePaginationClick: (pageNumber: number) => - dispatch(pagination(pageNumber)), + dispatch(setCurrentPage(pageNumber)), }); export default connect(mapStateToProps, mapDispatchToProps)(PaginationItem); diff --git a/src/client/modals/Settings/Settings.tsx b/src/client/modals/Settings/Settings.tsx index a342b5b..cabbd56 100644 --- a/src/client/modals/Settings/Settings.tsx +++ b/src/client/modals/Settings/Settings.tsx @@ -7,7 +7,7 @@ import { Container, Row } from "./Settings-styled"; import { displayNotification } from "../../redux/actions/application"; import { setModalContent, setModalTitle } from "../../redux/actions/modal"; -import { logOut, logOutAll } from "../../redux/thunks"; +import { logOut } from "../../redux/thunks"; export interface SettingsProps { handleClickDeleteProfile: () => void; @@ -78,7 +78,7 @@ const mapDispatchToProps = (dispatch) => ({ dispatch(setModalTitle("Reset Password")); }, handleLogOut: () => dispatch(logOut()), - handleLogOutAll: () => dispatch(logOutAll()), + handleLogOutAll: () => dispatch(logOut(true)), }); export default connect(null, mapDispatchToProps)(Settings); diff --git a/src/client/redux/thunks.ts b/src/client/redux/thunks.ts index ee3e371..e95f598 100644 --- a/src/client/redux/thunks.ts +++ b/src/client/redux/thunks.ts @@ -52,6 +52,20 @@ import { SignupSuccessResponse, } from "../types"; +export const globalErrorHandler = ( + response: ErrorResponse, + authenticatedRequest?: boolean +): AppThunk => (dispatch, getState) => { + if (authenticatedRequest) { + if (response.error === "Please authenticate.") { + // * Clear User and Redirect to Login + dispatch(authenticationRedirect()); + return; + } + } + dispatch(displayNotification(response.error, "error")); +}; + export const searchJobs = ( search: string, locationOptions: LocationOption[] @@ -105,10 +119,6 @@ export const searchJobs = ( dispatch(setIsLoading(false)); }; -export const pagination = (pageNumber: number): AppThunk => (dispatch) => { - dispatch(setCurrentPage(pageNumber)); -}; - export const logIn = (email: string, password: string): AppThunk => async ( dispatch ) => { @@ -251,10 +261,11 @@ export const initializeApplication = (): AppThunk => async (dispatch) => { } }; -export const logOut = (): AppThunk => async (dispatch) => { +export const logOut = (all?: boolean): AppThunk => async (dispatch) => { dispatch(setIsLoading(true)); // TODO - Modify - const response = await fetchServerData("/user/logout", "POST"); + const url = all ? "/user/logout/all" : "/user/logout"; + const response = await fetchServerData(url, "POST"); if (response.error) { if (response.error !== "Please authenticate.") { @@ -298,51 +309,17 @@ export const logOut = (): AppThunk => async (dispatch) => { dispatch(setIsLoading(false)); }; -export const logOutAll = (): AppThunk => async (dispatch) => { - dispatch(setIsLoading(true)); - // TODO - Modify - const response = await fetchServerData("/user/logout/all", "POST"); - - if (response.error) { - if (response.error !== "Please authenticate.") { - console.error(response.error); - dispatch( - displayNotification( - "Error when attempting to log out. Please try again or contact the developer.", - "error" - ) - ); - return; - } - } - - // * Establish Job Data - const jobsResult = (await fetchServerData( - "/jobs", - "POST", - JSON.stringify({ userId: "" }) - )) as ErrorResponse | GetJobsSuccessResponse; - - if (isError(jobsResult)) { - dispatch(displayNotification(jobsResult.error, "error")); - dispatch(setIsLoading(false)); - return; - } - - dispatch(displayNotification("", "default")); - dispatch(setCurrentJobs(jobsResult)); - dispatch(setTotalPages(Math.ceil(jobsResult.length / 5))); +export const authenticationRedirect = (): AppThunk => async (dispatch) => { + dispatch(setRedirectPath("/login")); dispatch(setEmail("")); dispatch(setName("")); dispatch(setId("")); dispatch(setSavedJobs([])); dispatch(setHiddenJobs([])); - dispatch(setIsLoggedIn(false)); dispatch(setIsModalOpen(false)); dispatch(setModalContent("")); dispatch(setModalTitle("")); - - dispatch(setIsLoading(false)); + dispatch(displayNotification("Please authenticate.", "error")); }; export const resetPassword = ( @@ -366,16 +343,7 @@ export const resetPassword = ( if (response.error) { if (response.error === "Please authenticate.") { // * Clear User and Redirect to Login - dispatch(setRedirectPath("/login")); - dispatch(setEmail("")); - dispatch(setName("")); - dispatch(setId("")); - dispatch(setSavedJobs([])); - dispatch(setHiddenJobs([])); - dispatch(setIsModalOpen(false)); - dispatch(setModalContent("")); - dispatch(setModalTitle("")); - dispatch(displayNotification(response.error, "error")); + dispatch(authenticationRedirect()); dispatch(setIsLoading(false)); return; } @@ -413,16 +381,7 @@ export const editProfile = (email: string, name: string): AppThunk => async ( if (response.error) { if (response.error === "Please authenticate.") { // * Clear User and Redirect to Login - dispatch(setRedirectPath("/login")); - dispatch(setEmail("")); - dispatch(setName("")); - dispatch(setId("")); - dispatch(setSavedJobs([])); - dispatch(setHiddenJobs([])); - dispatch(setIsModalOpen(false)); - dispatch(setModalContent("")); - dispatch(setModalTitle("")); - dispatch(displayNotification(response.error, "error")); + dispatch(authenticationRedirect()); dispatch(setIsLoading(false)); return; } @@ -462,16 +421,7 @@ export const deleteProfile = (): AppThunk => async (dispatch) => { if (response.error) { if (response.error === "Please authenticate.") { // * Clear User and Redirect to Login - dispatch(setRedirectPath("/login")); - dispatch(setEmail("")); - dispatch(setName("")); - dispatch(setId("")); - dispatch(setSavedJobs([])); - dispatch(setHiddenJobs([])); - dispatch(setIsModalOpen(false)); - dispatch(setModalContent("")); - dispatch(setModalTitle("")); - dispatch(displayNotification(response.error, "error")); + dispatch(authenticationRedirect()); dispatch(setIsLoading(false)); return; } @@ -515,22 +465,7 @@ export const addHiddenJob = (id: string): AppThunk => async ( ); if (isError(result)) { - if (result.error === "Please authenticate.") { - // * Clear User and Redirect to Login - dispatch(setRedirectPath("/login")); - dispatch(setEmail("")); - dispatch(setName("")); - dispatch(setId("")); - dispatch(setSavedJobs([])); - dispatch(setHiddenJobs([])); - dispatch(setIsModalOpen(false)); - dispatch(setModalContent("")); - dispatch(setModalTitle("")); - dispatch(displayNotification(result.error, "error")); - dispatch(setIsLoading(false)); - return; - } - dispatch(displayNotification(result.error, "error")); + dispatch(globalErrorHandler(result, true)); dispatch(setIsLoading(false)); return; } @@ -568,22 +503,7 @@ export const addSavedJob = (id: string): AppThunk => async (dispatch) => { ); if (isError(result)) { - if (result.error === "Please authenticate.") { - // * Clear User and Redirect to Login - dispatch(setRedirectPath("/login")); - dispatch(setEmail("")); - dispatch(setName("")); - dispatch(setId("")); - dispatch(setSavedJobs([])); - dispatch(setHiddenJobs([])); - dispatch(setIsModalOpen(false)); - dispatch(setModalContent("")); - dispatch(setModalTitle("")); - dispatch(displayNotification(result.error, "error")); - dispatch(setIsLoading(false)); - return; - } - dispatch(displayNotification(result.error, "error")); + dispatch(globalErrorHandler(result, true)); dispatch(setIsLoading(false)); return; } @@ -615,22 +535,7 @@ export const removeHiddenJob = (id: string): AppThunk => async (dispatch) => { ); if (isError(result)) { - if (result.error === "Please authenticate.") { - // * Clear User and Redirect to Login - dispatch(setRedirectPath("/login")); - dispatch(setEmail("")); - dispatch(setName("")); - dispatch(setId("")); - dispatch(setSavedJobs([])); - dispatch(setHiddenJobs([])); - dispatch(setIsModalOpen(false)); - dispatch(setModalContent("")); - dispatch(setModalTitle("")); - dispatch(displayNotification(result.error, "error")); - dispatch(setIsLoading(false)); - return; - } - dispatch(displayNotification(result.error, "error")); + dispatch(globalErrorHandler(result, true)); dispatch(setIsLoading(false)); return; } @@ -660,22 +565,7 @@ export const removeSavedJob = (id: string): AppThunk => async (dispatch) => { ); if (isError(result)) { - if (result.error === "Please authenticate.") { - // * Clear User and Redirect to Login - dispatch(setRedirectPath("/login")); - dispatch(setEmail("")); - dispatch(setName("")); - dispatch(setId("")); - dispatch(setSavedJobs([])); - dispatch(setHiddenJobs([])); - dispatch(setIsModalOpen(false)); - dispatch(setModalContent("")); - dispatch(setModalTitle("")); - dispatch(displayNotification(result.error, "error")); - dispatch(setIsLoading(false)); - return; - } - dispatch(displayNotification(result.error, "error")); + dispatch(globalErrorHandler(result, true)); dispatch(setIsLoading(false)); return; } @@ -718,7 +608,7 @@ export const getJobDetails = (id: string): AppThunk => async (dispatch) => { const result: Job = await fetchServerData(`/jobs/${id}`, "GET"); if (isError(result)) { - dispatch(displayNotification(result.error, "error")); + dispatch(globalErrorHandler(result, false)); dispatch(setIsLoading(false)); return; } @@ -745,7 +635,7 @@ export const getSavedJobsDetails = (): AppThunk => async (dispatch) => { ); if (isError(result)) { - dispatch(displayNotification(result.error, "error")); + dispatch(globalErrorHandler(result, true)); dispatch(setIsLoading(false)); return; } @@ -772,7 +662,7 @@ export const getHiddenJobsDetails = (): AppThunk => async (dispatch) => { ); if (isError(result)) { - dispatch(displayNotification(result.error, "error")); + dispatch(globalErrorHandler(result, true)); dispatch(setIsLoading(false)); return; } From 5464510a977b9cb713c5645005c49338d93b6879 Mon Sep 17 00:00:00 2001 From: alexlee-dev Date: Fri, 21 Aug 2020 08:23:51 -0700 Subject: [PATCH 05/17] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20Refactor=20Thunks=20?= =?UTF-8?q?#103=20-=20Refactor=20Part=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/client/App.tsx | 2 +- src/client/components/JobCard/JobCard.tsx | 2 +- src/client/components/Modal/Modal.tsx | 2 +- .../components/OptionsPanel/OptionsPanel.tsx | 2 +- .../Profile/ProfileAccountDetails.tsx | 2 +- .../Profile/ProfileAccountStats.tsx | 5 +- .../components/SearchInput/SearchInput.tsx | 2 +- .../modals/DeleteProfile/DeleteProfile.tsx | 2 +- src/client/modals/HiddenJobs/HiddenJobs.tsx | 2 +- .../modals/ResetPassword/ResetPassword.tsx | 2 +- src/client/modals/SavedJobs/SavedJobs.tsx | 2 +- src/client/modals/Settings/Settings.tsx | 2 +- src/client/pages/Details/Details.tsx | 8 +- src/client/pages/Login/Login.tsx | 2 +- src/client/pages/Signup/Signup.tsx | 2 +- src/client/redux/thunks/application.ts | 173 +++++ src/client/redux/thunks/modal.ts | 12 + .../redux/{thunks.ts => thunks/user.ts} | 656 +++++++----------- src/client/redux/thunks/util.ts | 42 ++ 19 files changed, 488 insertions(+), 434 deletions(-) create mode 100644 src/client/redux/thunks/application.ts create mode 100644 src/client/redux/thunks/modal.ts rename src/client/redux/{thunks.ts => thunks/user.ts} (72%) create mode 100644 src/client/redux/thunks/util.ts diff --git a/src/client/App.tsx b/src/client/App.tsx index afd7829..d279914 100644 --- a/src/client/App.tsx +++ b/src/client/App.tsx @@ -16,7 +16,7 @@ import Modal from "./components/Modal"; import Navigation from "./components/Navigation"; import { setError } from "./redux/actions/application"; -import { initializeApplication } from "./redux/thunks"; +import { initializeApplication } from "./redux/thunks/application"; import { history } from "./util"; diff --git a/src/client/components/JobCard/JobCard.tsx b/src/client/components/JobCard/JobCard.tsx index 8c199f6..33dfd16 100644 --- a/src/client/components/JobCard/JobCard.tsx +++ b/src/client/components/JobCard/JobCard.tsx @@ -26,7 +26,7 @@ import { addSavedJob, removeHiddenJob, removeSavedJob, -} from "../../redux/thunks"; +} from "../../redux/thunks/user"; import { Job, RootState } from "../../types"; import { setJobDetails } from "../../redux/actions/application"; diff --git a/src/client/components/Modal/Modal.tsx b/src/client/components/Modal/Modal.tsx index 45da26e..35145e8 100644 --- a/src/client/components/Modal/Modal.tsx +++ b/src/client/components/Modal/Modal.tsx @@ -10,7 +10,7 @@ import { import contents from "./contents"; -import { resetModal } from "../../redux/thunks"; +import { resetModal } from "../../redux/thunks/modal"; import { RootState } from "../../types"; diff --git a/src/client/components/OptionsPanel/OptionsPanel.tsx b/src/client/components/OptionsPanel/OptionsPanel.tsx index d0850a6..abe54b1 100644 --- a/src/client/components/OptionsPanel/OptionsPanel.tsx +++ b/src/client/components/OptionsPanel/OptionsPanel.tsx @@ -12,7 +12,7 @@ import { setFullTime, setLocationSearch, } from "../../redux/actions/application"; -import { searchJobs } from "../../redux/thunks"; +import { searchJobs } from "../../redux/thunks/application"; import { LocationOption, RootState } from "../../types"; diff --git a/src/client/components/Profile/ProfileAccountDetails.tsx b/src/client/components/Profile/ProfileAccountDetails.tsx index 4f90178..03a672d 100644 --- a/src/client/components/Profile/ProfileAccountDetails.tsx +++ b/src/client/components/Profile/ProfileAccountDetails.tsx @@ -17,7 +17,7 @@ import { setModalTitle, } from "../../redux/actions/modal"; import { setIsEditingProfile } from "../../redux/actions/user"; -import { editProfile } from "../../redux/thunks"; +import { editProfile } from "../../redux/thunks/user"; import { RootState } from "../../types"; diff --git a/src/client/components/Profile/ProfileAccountStats.tsx b/src/client/components/Profile/ProfileAccountStats.tsx index 4560077..0d26982 100644 --- a/src/client/components/Profile/ProfileAccountStats.tsx +++ b/src/client/components/Profile/ProfileAccountStats.tsx @@ -11,7 +11,10 @@ import { ProfileAccountStatsInnerContainer, } from "./Profile-styled"; -import { clickViewHiddenJobs, clickViewSavedJobs } from "../../redux/thunks"; +import { + clickViewHiddenJobs, + clickViewSavedJobs, +} from "../../redux/thunks/user"; import { RootState } from "../../types"; diff --git a/src/client/components/SearchInput/SearchInput.tsx b/src/client/components/SearchInput/SearchInput.tsx index e0faae6..69d3c48 100644 --- a/src/client/components/SearchInput/SearchInput.tsx +++ b/src/client/components/SearchInput/SearchInput.tsx @@ -12,7 +12,7 @@ import { SearchInputButtonContainer, } from "./SearchInput-styled"; -import { searchJobs } from "../../redux/thunks"; +import { searchJobs } from "../../redux/thunks/application"; import { LocationOption, RootState } from "../../types"; diff --git a/src/client/modals/DeleteProfile/DeleteProfile.tsx b/src/client/modals/DeleteProfile/DeleteProfile.tsx index 84bcd04..ba81c92 100644 --- a/src/client/modals/DeleteProfile/DeleteProfile.tsx +++ b/src/client/modals/DeleteProfile/DeleteProfile.tsx @@ -7,7 +7,7 @@ import { ActionsContainer } from "./DeleteProfile-styled"; import { displayNotification } from "../../redux/actions/application"; import { setModalContent, setModalTitle } from "../../redux/actions/modal"; -import { deleteProfile } from "../../redux/thunks"; +import { deleteProfile } from "../../redux/thunks/user"; export interface DeleteProfileProps { handleCancelDeleteProfile: () => void; diff --git a/src/client/modals/HiddenJobs/HiddenJobs.tsx b/src/client/modals/HiddenJobs/HiddenJobs.tsx index 9d7270d..dcf74cc 100644 --- a/src/client/modals/HiddenJobs/HiddenJobs.tsx +++ b/src/client/modals/HiddenJobs/HiddenJobs.tsx @@ -4,7 +4,7 @@ import { connect } from "react-redux"; import JobCard from "../../components/JobCard"; import Pagination from "../../components/Pagination"; -import { getHiddenJobsDetails } from "../../redux/thunks"; +import { getHiddenJobsDetails } from "../../redux/thunks/user"; import { RootState, Job } from "../../types"; diff --git a/src/client/modals/ResetPassword/ResetPassword.tsx b/src/client/modals/ResetPassword/ResetPassword.tsx index a1de3b8..266bc74 100644 --- a/src/client/modals/ResetPassword/ResetPassword.tsx +++ b/src/client/modals/ResetPassword/ResetPassword.tsx @@ -8,7 +8,7 @@ import { ActionsContainer } from "./ResetPassword-styled"; import { displayNotification } from "../../redux/actions/application"; import { setModalContent, setModalTitle } from "../../redux/actions/modal"; -import { resetPassword } from "../../redux/thunks"; +import { resetPassword } from "../../redux/thunks/user"; export interface ResetPasswordProps { handleCancelResetPassword: () => void; diff --git a/src/client/modals/SavedJobs/SavedJobs.tsx b/src/client/modals/SavedJobs/SavedJobs.tsx index a6b8466..230729b 100644 --- a/src/client/modals/SavedJobs/SavedJobs.tsx +++ b/src/client/modals/SavedJobs/SavedJobs.tsx @@ -4,7 +4,7 @@ import { connect } from "react-redux"; import JobCard from "../../components/JobCard"; import Pagination from "../../components/Pagination"; -import { getSavedJobsDetails } from "../../redux/thunks"; +import { getSavedJobsDetails } from "../../redux/thunks/user"; import { RootState, Job } from "../../types"; diff --git a/src/client/modals/Settings/Settings.tsx b/src/client/modals/Settings/Settings.tsx index cabbd56..34b9cbd 100644 --- a/src/client/modals/Settings/Settings.tsx +++ b/src/client/modals/Settings/Settings.tsx @@ -7,7 +7,7 @@ import { Container, Row } from "./Settings-styled"; import { displayNotification } from "../../redux/actions/application"; import { setModalContent, setModalTitle } from "../../redux/actions/modal"; -import { logOut } from "../../redux/thunks"; +import { logOut } from "../../redux/thunks/user"; export interface SettingsProps { handleClickDeleteProfile: () => void; diff --git a/src/client/pages/Details/Details.tsx b/src/client/pages/Details/Details.tsx index 7e5041a..8423988 100644 --- a/src/client/pages/Details/Details.tsx +++ b/src/client/pages/Details/Details.tsx @@ -23,12 +23,12 @@ import { } from "./Details-styled"; import { - addSavedJob, - getJobDetails, - removeSavedJob, addHiddenJob, + addSavedJob, removeHiddenJob, -} from "../../redux/thunks"; + removeSavedJob, +} from "../../redux/thunks/user"; +import { getJobDetails } from "../../redux/thunks/application"; import { Job, RootState } from "../../types"; diff --git a/src/client/pages/Login/Login.tsx b/src/client/pages/Login/Login.tsx index ca758ce..c9d37a0 100644 --- a/src/client/pages/Login/Login.tsx +++ b/src/client/pages/Login/Login.tsx @@ -14,7 +14,7 @@ import { import { setRedirectPath } from "../../redux/actions/application"; import { setIsLoggedIn } from "../../redux/actions/user"; -import { logIn } from "../../redux/thunks"; +import { logIn } from "../../redux/thunks/user"; import { RootState } from "../../types"; diff --git a/src/client/pages/Signup/Signup.tsx b/src/client/pages/Signup/Signup.tsx index 9c00613..197475d 100644 --- a/src/client/pages/Signup/Signup.tsx +++ b/src/client/pages/Signup/Signup.tsx @@ -12,7 +12,7 @@ import { SignupActionsContainer, } from "./Signup-styled"; -import { signup } from "../../redux/thunks"; +import { signup } from "../../redux/thunks/user"; import { RootState } from "../../types"; diff --git a/src/client/redux/thunks/application.ts b/src/client/redux/thunks/application.ts new file mode 100644 index 0000000..039c995 --- /dev/null +++ b/src/client/redux/thunks/application.ts @@ -0,0 +1,173 @@ +import { globalErrorHandler } from "./util"; +import { + displayNotification, + setCurrentJobs, + setCurrentPage, + setError, + setIsLoading, + setJobDetails, + setJobs, + setLocationSearch, + setSearchValue, + setTotalPages, +} from "../actions/application"; +import { + setIsModalOpen, + setModalContent, + setModalTitle, +} from "../actions/modal"; +import { + setEmail, + setHiddenJobs, + setId, + setIsLoggedIn, + setName, + setSavedJobs, +} from "../actions/user"; +import { fetchServerData, isError } from "../../util"; + +import { + AppThunk, + ErrorResponse, + GetJobsSuccessResponse, + Job, + LocationOption, + RootState, + ServerResponseUser, +} from "../../types"; + +export const getJobDetails = (id: string): AppThunk => async (dispatch) => { + dispatch(setIsLoading(true)); + dispatch(displayNotification("", "default")); + + try { + const result: Job = await fetchServerData(`/jobs/${id}`, "GET"); + + if (isError(result)) { + dispatch(globalErrorHandler(result, false)); + dispatch(setIsLoading(false)); + return; + } + + dispatch(setJobDetails(result)); + dispatch(setIsLoading(false)); + } catch (error) { + console.error(error); + dispatch(displayNotification(error, "error")); + dispatch(setIsLoading(false)); + } +}; + +export const initializeApplication = (): AppThunk => async (dispatch) => { + try { + dispatch(setIsLoading(true)); + + // * Reset State to Defaults + dispatch(displayNotification("", "default")); + dispatch(setError(null, null)); + dispatch(setCurrentJobs([])); + dispatch(setCurrentPage(1)); + dispatch(setJobDetails(null)); + dispatch(setJobs([])); + dispatch(setTotalPages(1)); + dispatch(setIsModalOpen(false)); + dispatch(setModalContent("")); + dispatch(setModalTitle("")); + dispatch(setSearchValue("")); + dispatch(setLocationSearch("")); + + // * Establish User Authentication + const userResponse = await fetch("/user/me"); + let userId = ""; + + if (userResponse.status === 200) { + // * User is authenticated + const user: ServerResponseUser = await userResponse.json(); + + userId = user._id; + + dispatch(setName(user.name)); + dispatch(setEmail(user.email)); + dispatch(setId(userId)); + dispatch(setSavedJobs(user.savedJobs)); + dispatch(setHiddenJobs(user.hiddenJobs)); + dispatch(setIsLoggedIn(true)); + } + + // * Establish Job Data + const jobsResult = (await fetchServerData( + "/jobs", + "POST", + JSON.stringify({ userId }) + )) as ErrorResponse | GetJobsSuccessResponse; + + if (isError(jobsResult)) { + dispatch(displayNotification(jobsResult.error, "error")); + dispatch(setIsLoading(false)); + return; + } + + dispatch(setJobs(jobsResult)); + dispatch(setCurrentPage(1)); + dispatch(setTotalPages(Math.ceil(jobsResult.length / 5))); + dispatch(setCurrentJobs(jobsResult)); + dispatch(setIsLoading(false)); + } catch (error) { + console.error(error); + dispatch(displayNotification(error, "error")); + dispatch(setIsLoading(false)); + } +}; + +export const searchJobs = ( + search: string, + locationOptions: LocationOption[] +): AppThunk => async (dispatch, getState) => { + dispatch(setIsLoading(true)); + dispatch(displayNotification("", "default")); + dispatch(setSearchValue(search)); + + const state: RootState = getState(); + const { contract, fullTime, locationSearch } = state.application; + const { id } = state.user; + + const locationsSearches = locationOptions.filter( + (location: LocationOption) => location.value !== "" + ); + + if (locationSearch) { + locationsSearches.push({ + name: "locationSearch", + setter: null, + value: locationSearch, + }); + } + + let url = `/jobs/search?userId=${encodeURI(id)}&full_time=${encodeURI( + fullTime.toString() + )}&contract=${encodeURI(contract.toString())}&description=${encodeURI( + search + )}`; + + locationsSearches.forEach((locationSearch: LocationOption, i: number) => { + url = url + `&location${i + 1}=${encodeURI(locationSearch.value)}`; + }); + + const data = (await fetchServerData(url, "GET")) as + | ErrorResponse + | GetJobsSuccessResponse; + + if (isError(data)) { + dispatch(displayNotification(data.error, "error")); + dispatch(setIsLoading(false)); + return; + } + + dispatch(setCurrentJobs(data)); + dispatch(setCurrentPage(1)); + dispatch(setTotalPages(Math.ceil(data.length / 5))); + dispatch( + displayNotification(`Search returned ${data.length} results.`, "success") + ); + dispatch(setIsLoading(false)); +}; diff --git a/src/client/redux/thunks/modal.ts b/src/client/redux/thunks/modal.ts new file mode 100644 index 0000000..4caf895 --- /dev/null +++ b/src/client/redux/thunks/modal.ts @@ -0,0 +1,12 @@ +import { + setIsModalOpen, + setModalContent, + setModalTitle, +} from "../actions/modal"; +import { AppThunk } from "../../types"; + +export const resetModal = (): AppThunk => (dispatch) => { + dispatch(setIsModalOpen(false)); + dispatch(setModalContent("")); + dispatch(setModalTitle("")); +}; diff --git a/src/client/redux/thunks.ts b/src/client/redux/thunks/user.ts similarity index 72% rename from src/client/redux/thunks.ts rename to src/client/redux/thunks/user.ts index e95f598..13eab2c 100644 --- a/src/client/redux/thunks.ts +++ b/src/client/redux/thunks/user.ts @@ -1,23 +1,21 @@ +import { authenticationRedirect, globalErrorHandler } from "./util"; import { displayNotification, setCurrentJobs, setCurrentPage, setIsLoading, - setJobs, - setSearchValue, setTotalPages, - setJobDetails, - setError, - setRedirectPath, - setLocationSearch, -} from "./actions/application"; +} from "../actions/application"; import { setIsModalOpen, setModalContent, setModalTitle, -} from "./actions/modal"; +} from "../actions/modal"; import { setEmail, + setHiddenJobs, + setHiddenJobsDetails, + setId, setIsEditingProfile, setIsLoggedIn, setName, @@ -25,11 +23,8 @@ import { setSavedJobsCurrentPage, setSavedJobsDetails, setSavedJobsTotalPages, - setHiddenJobs, - setHiddenJobsDetails, - setId, -} from "./actions/user"; -import { fetchServerData, isError } from "../util"; +} from "../actions/user"; +import { fetchServerData, isError } from "../../util"; import { AddHiddenJobSuccessResponse, @@ -42,217 +37,49 @@ import { GetJobsSuccessResponse, GetSavedJobsDetailsSuccessResponse, Job, - LocationOption, LoginResponse, RemoveHiddenJobSuccessResponse, RemoveSavedJobSuccessResponse, ResetPasswordResponse, RootState, - ServerResponseUser, SignupSuccessResponse, -} from "../types"; - -export const globalErrorHandler = ( - response: ErrorResponse, - authenticatedRequest?: boolean -): AppThunk => (dispatch, getState) => { - if (authenticatedRequest) { - if (response.error === "Please authenticate.") { - // * Clear User and Redirect to Login - dispatch(authenticationRedirect()); - return; - } - } - dispatch(displayNotification(response.error, "error")); -}; - -export const searchJobs = ( - search: string, - locationOptions: LocationOption[] -): AppThunk => async (dispatch, getState) => { - dispatch(setIsLoading(true)); - dispatch(displayNotification("", "default")); - dispatch(setSearchValue(search)); - - const state: RootState = getState(); - const { contract, fullTime, locationSearch } = state.application; - const { id } = state.user; - - const locationsSearches = locationOptions.filter( - (location: LocationOption) => location.value !== "" - ); +} from "../../types"; - if (locationSearch) { - locationsSearches.push({ - name: "locationSearch", - setter: null, - value: locationSearch, - }); - } - - let url = `/jobs/search?userId=${encodeURI(id)}&full_time=${encodeURI( - fullTime.toString() - )}&contract=${encodeURI(contract.toString())}&description=${encodeURI( - search - )}`; - - locationsSearches.forEach((locationSearch: LocationOption, i: number) => { - url = url + `&location${i + 1}=${encodeURI(locationSearch.value)}`; - }); - - const data = (await fetchServerData(url, "GET")) as - | ErrorResponse - | GetJobsSuccessResponse; - - if (isError(data)) { - dispatch(displayNotification(data.error, "error")); - dispatch(setIsLoading(false)); - return; - } - - dispatch(setCurrentJobs(data)); - dispatch(setCurrentPage(1)); - dispatch(setTotalPages(Math.ceil(data.length / 5))); - dispatch( - displayNotification(`Search returned ${data.length} results.`, "success") - ); - dispatch(setIsLoading(false)); -}; - -export const logIn = (email: string, password: string): AppThunk => async ( - dispatch +export const addHiddenJob = (id: string): AppThunk => async ( + dispatch, + getState ) => { dispatch(setIsLoading(true)); - dispatch(displayNotification("", "default")); - - // TODO - Modify - const response: LoginResponse = await fetchServerData( - "/user/login", - "POST", - JSON.stringify({ email, password }) - ); - - if (response.error) { - dispatch(displayNotification(response.error, "error")); - dispatch(setIsLoading(false)); - return; - } - - // * Establish Job Data - const jobsResult = (await fetchServerData( - "/jobs", - "POST", - JSON.stringify({ userId: response._id }) - )) as ErrorResponse | GetJobsSuccessResponse; - - if (isError(jobsResult)) { - dispatch(displayNotification(jobsResult.error, "error")); - dispatch(setIsLoading(false)); - return; - } - - dispatch(setIsLoggedIn(true)); - dispatch(setCurrentJobs(jobsResult)); - dispatch(setTotalPages(Math.ceil(jobsResult.length / 5))); - dispatch(setEmail(response.email)); - dispatch(setName(response.name)); - dispatch(setId(response._id)); - dispatch(setSavedJobs(response.savedJobs)); - dispatch(setHiddenJobs(response.hiddenJobs)); - - dispatch(setIsLoading(false)); -}; - -export const signup = ( - name: string, - email: string, - password: string, - confirmPassword: string -): AppThunk => async (dispatch) => { - dispatch(setIsLoading(true)); - dispatch(displayNotification("", "default")); - - if (confirmPassword !== password) { - dispatch(displayNotification("Passwords do not match.", "error")); - dispatch(setIsLoading(false)); - return; - } - - // TODO - Modify - const result: ErrorResponse | SignupSuccessResponse = await fetchServerData( - "/user", - "POST", - JSON.stringify({ confirmPassword, email, name, password }) - ); - - if (isError(result)) { - dispatch(displayNotification(result.error, "error")); - dispatch(setIsLoading(false)); - return; - } - - dispatch(setIsLoggedIn(true)); - dispatch(setEmail(result.email)); - dispatch(setName(result.name)); - dispatch(setSavedJobs(result.savedJobs)); - dispatch(setHiddenJobs(result.hiddenJobs)); - - dispatch(setIsLoading(false)); -}; - -export const initializeApplication = (): AppThunk => async (dispatch) => { try { - dispatch(setIsLoading(true)); - - // * Reset State to Defaults - dispatch(displayNotification("", "default")); - dispatch(setError(null, null)); - dispatch(setCurrentJobs([])); - dispatch(setCurrentPage(1)); - dispatch(setJobDetails(null)); - dispatch(setJobs([])); - dispatch(setTotalPages(1)); - dispatch(setIsModalOpen(false)); - dispatch(setModalContent("")); - dispatch(setModalTitle("")); - dispatch(setSearchValue("")); - dispatch(setLocationSearch("")); - - // * Establish User Authentication - const userResponse = await fetch("/user/me"); - let userId = ""; - - if (userResponse.status === 200) { - // * User is authenticated - const user: ServerResponseUser = await userResponse.json(); - - userId = user._id; - - dispatch(setName(user.name)); - dispatch(setEmail(user.email)); - dispatch(setId(userId)); - dispatch(setSavedJobs(user.savedJobs)); - dispatch(setHiddenJobs(user.hiddenJobs)); - dispatch(setIsLoggedIn(true)); - } - - // * Establish Job Data - const jobsResult = (await fetchServerData( - "/jobs", - "POST", - JSON.stringify({ userId }) - )) as ErrorResponse | GetJobsSuccessResponse; + const state: RootState = getState(); + const { currentJobs, currentPage } = state.application; + // TODO - Modify + const result: + | ErrorResponse + | AddHiddenJobSuccessResponse = await fetchServerData( + "/user/hiddenJobs", + "PATCH", + JSON.stringify({ method: "ADD", id }) + ); - if (isError(jobsResult)) { - dispatch(displayNotification(jobsResult.error, "error")); + if (isError(result)) { + dispatch(globalErrorHandler(result, true)); dispatch(setIsLoading(false)); return; } - dispatch(setJobs(jobsResult)); - dispatch(setCurrentPage(1)); - dispatch(setTotalPages(Math.ceil(jobsResult.length / 5))); - dispatch(setCurrentJobs(jobsResult)); + const { hiddenJobs } = result; + + const newCurrentJobs = currentJobs.filter((job: Job) => job.id !== id); + const newTotalPages = Math.ceil(newCurrentJobs.length / 5); + + dispatch(setHiddenJobs(hiddenJobs)); + dispatch(setCurrentJobs(newCurrentJobs)); + dispatch(setTotalPages(newTotalPages)); + if (currentPage > newTotalPages) { + dispatch(setCurrentPage(newTotalPages)); + } + dispatch(displayNotification("Job hidden successfully.", "success")); dispatch(setIsLoading(false)); } catch (error) { console.error(error); @@ -261,83 +88,63 @@ export const initializeApplication = (): AppThunk => async (dispatch) => { } }; -export const logOut = (all?: boolean): AppThunk => async (dispatch) => { +export const addSavedJob = (id: string): AppThunk => async (dispatch) => { dispatch(setIsLoading(true)); - // TODO - Modify - const url = all ? "/user/logout/all" : "/user/logout"; - const response = await fetchServerData(url, "POST"); + try { + // TODO - Modify + const result: + | ErrorResponse + | AddSavedJobSuccessResponse = await fetchServerData( + "/user/savedJobs", + "PATCH", + JSON.stringify({ method: "ADD", id }) + ); - if (response.error) { - if (response.error !== "Please authenticate.") { - console.error(response.error); - dispatch( - displayNotification( - "Error when attempting to log out. Please try again or contact the developer.", - "error" - ) - ); + if (isError(result)) { + dispatch(globalErrorHandler(result, true)); + dispatch(setIsLoading(false)); return; } - } - // * Establish Job Data - const jobsResult = (await fetchServerData( - "/jobs", - "POST", - JSON.stringify({ userId: "" }) - )) as ErrorResponse | GetJobsSuccessResponse; + const { savedJobs } = result; - if (isError(jobsResult)) { - dispatch(displayNotification(jobsResult.error, "error")); + dispatch(setSavedJobs(savedJobs)); + dispatch(setSavedJobsCurrentPage(1)); + dispatch(setSavedJobsTotalPages(Math.ceil(savedJobs.length / 5))); + dispatch(displayNotification("Job saved successfully.", "success")); + dispatch(setIsLoading(false)); + } catch (error) { + console.error(error); + dispatch(displayNotification(error, "error")); dispatch(setIsLoading(false)); - return; } +}; +export const clickViewHiddenJobs = (): AppThunk => (dispatch) => { + dispatch(setCurrentPage(1)); dispatch(displayNotification("", "default")); - dispatch(setCurrentJobs(jobsResult)); - dispatch(setTotalPages(Math.ceil(jobsResult.length / 5))); - dispatch(setEmail("")); - dispatch(setName("")); - dispatch(setId("")); - dispatch(setSavedJobs([])); - dispatch(setHiddenJobs([])); - dispatch(setIsLoggedIn(false)); - dispatch(setIsModalOpen(false)); - dispatch(setModalContent("")); - dispatch(setModalTitle("")); - - dispatch(setIsLoading(false)); + dispatch(setModalContent("hiddenJobs")); + dispatch(setModalTitle("Hidden Jobs")); + dispatch(setIsModalOpen(true)); }; -export const authenticationRedirect = (): AppThunk => async (dispatch) => { - dispatch(setRedirectPath("/login")); - dispatch(setEmail("")); - dispatch(setName("")); - dispatch(setId("")); - dispatch(setSavedJobs([])); - dispatch(setHiddenJobs([])); - dispatch(setIsModalOpen(false)); - dispatch(setModalContent("")); - dispatch(setModalTitle("")); - dispatch(displayNotification("Please authenticate.", "error")); +export const clickViewSavedJobs = (): AppThunk => (dispatch) => { + dispatch(setCurrentPage(1)); + dispatch(displayNotification("", "default")); + dispatch(setModalContent("savedJobs")); + dispatch(setModalTitle("Saved Jobs")); + dispatch(setIsModalOpen(true)); }; -export const resetPassword = ( - currentPassword: string, - newPassword: string -): AppThunk => async (dispatch) => { +export const deleteProfile = (): AppThunk => async (dispatch) => { dispatch(setIsLoading(true)); dispatch(displayNotification("", "default")); try { // TODO - Modify - const response: ResetPasswordResponse = await fetchServerData( + const response: DeleteProfileResponse = await fetchServerData( "/user/me", - "PATCH", - JSON.stringify({ - currentPassword, - newPassword, - }) + "DELETE" ); if (response.error) { @@ -352,11 +159,16 @@ export const resetPassword = ( return; } - dispatch(displayNotification("Password reset successfully.", "success")); + dispatch(displayNotification("Profile deleted successfully.", "success")); + dispatch(setEmail("")); + dispatch(setName("")); + dispatch(setSavedJobs([])); + dispatch(setHiddenJobs([])); + dispatch(setIsLoggedIn(false)); + dispatch(setIsLoading(false)); dispatch(setIsModalOpen(false)); dispatch(setModalContent("")); dispatch(setModalTitle("")); - dispatch(setIsLoading(false)); } catch (error) { console.error(error); dispatch(displayNotification(error, "error")); @@ -407,39 +219,26 @@ export const editProfile = (email: string, name: string): AppThunk => async ( } }; -export const deleteProfile = (): AppThunk => async (dispatch) => { +export const getHiddenJobsDetails = (): AppThunk => async (dispatch) => { dispatch(setIsLoading(true)); dispatch(displayNotification("", "default")); try { - // TODO - Modify - const response: DeleteProfileResponse = await fetchServerData( - "/user/me", - "DELETE" + const result: + | ErrorResponse + | GetHiddenJobsDetailsSuccessResponse = await fetchServerData( + `/user/hiddenJobsDetails`, + "GET" ); - if (response.error) { - if (response.error === "Please authenticate.") { - // * Clear User and Redirect to Login - dispatch(authenticationRedirect()); - dispatch(setIsLoading(false)); - return; - } - dispatch(displayNotification(response.error, "error")); + if (isError(result)) { + dispatch(globalErrorHandler(result, true)); dispatch(setIsLoading(false)); return; } - dispatch(displayNotification("Profile deleted successfully.", "success")); - dispatch(setEmail("")); - dispatch(setName("")); - dispatch(setSavedJobs([])); - dispatch(setHiddenJobs([])); - dispatch(setIsLoggedIn(false)); + dispatch(setHiddenJobsDetails(result)); dispatch(setIsLoading(false)); - dispatch(setIsModalOpen(false)); - dispatch(setModalContent("")); - dispatch(setModalTitle("")); } catch (error) { console.error(error); dispatch(displayNotification(error, "error")); @@ -447,21 +246,16 @@ export const deleteProfile = (): AppThunk => async (dispatch) => { } }; -export const addHiddenJob = (id: string): AppThunk => async ( - dispatch, - getState -) => { +export const getSavedJobsDetails = (): AppThunk => async (dispatch) => { dispatch(setIsLoading(true)); + dispatch(displayNotification("", "default")); + try { - const state: RootState = getState(); - const { currentJobs, currentPage } = state.application; - // TODO - Modify const result: | ErrorResponse - | AddHiddenJobSuccessResponse = await fetchServerData( - "/user/hiddenJobs", - "PATCH", - JSON.stringify({ method: "ADD", id }) + | GetSavedJobsDetailsSuccessResponse = await fetchServerData( + `/user/savedJobsDetails`, + "GET" ); if (isError(result)) { @@ -470,18 +264,7 @@ export const addHiddenJob = (id: string): AppThunk => async ( return; } - const { hiddenJobs } = result; - - const newCurrentJobs = currentJobs.filter((job: Job) => job.id !== id); - const newTotalPages = Math.ceil(newCurrentJobs.length / 5); - - dispatch(setHiddenJobs(hiddenJobs)); - dispatch(setCurrentJobs(newCurrentJobs)); - dispatch(setTotalPages(newTotalPages)); - if (currentPage > newTotalPages) { - dispatch(setCurrentPage(newTotalPages)); - } - dispatch(displayNotification("Job hidden successfully.", "success")); + dispatch(setSavedJobsDetails(result)); dispatch(setIsLoading(false)); } catch (error) { console.error(error); @@ -490,76 +273,106 @@ export const addHiddenJob = (id: string): AppThunk => async ( } }; -export const addSavedJob = (id: string): AppThunk => async (dispatch) => { +export const logIn = (email: string, password: string): AppThunk => async ( + dispatch +) => { dispatch(setIsLoading(true)); - try { - // TODO - Modify - const result: - | ErrorResponse - | AddSavedJobSuccessResponse = await fetchServerData( - "/user/savedJobs", - "PATCH", - JSON.stringify({ method: "ADD", id }) - ); - - if (isError(result)) { - dispatch(globalErrorHandler(result, true)); - dispatch(setIsLoading(false)); - return; - } + dispatch(displayNotification("", "default")); - const { savedJobs } = result; + // TODO - Modify + const response: LoginResponse = await fetchServerData( + "/user/login", + "POST", + JSON.stringify({ email, password }) + ); - dispatch(setSavedJobs(savedJobs)); - dispatch(setSavedJobsCurrentPage(1)); - dispatch(setSavedJobsTotalPages(Math.ceil(savedJobs.length / 5))); - dispatch(displayNotification("Job saved successfully.", "success")); + if (response.error) { + dispatch(displayNotification(response.error, "error")); dispatch(setIsLoading(false)); - } catch (error) { - console.error(error); - dispatch(displayNotification(error, "error")); + return; + } + + // * Establish Job Data + const jobsResult = (await fetchServerData( + "/jobs", + "POST", + JSON.stringify({ userId: response._id }) + )) as ErrorResponse | GetJobsSuccessResponse; + + if (isError(jobsResult)) { + dispatch(displayNotification(jobsResult.error, "error")); dispatch(setIsLoading(false)); + return; } + + dispatch(setIsLoggedIn(true)); + dispatch(setCurrentJobs(jobsResult)); + dispatch(setTotalPages(Math.ceil(jobsResult.length / 5))); + dispatch(setEmail(response.email)); + dispatch(setName(response.name)); + dispatch(setId(response._id)); + dispatch(setSavedJobs(response.savedJobs)); + dispatch(setHiddenJobs(response.hiddenJobs)); + + dispatch(setIsLoading(false)); }; -export const removeHiddenJob = (id: string): AppThunk => async (dispatch) => { +export const logOut = (all?: boolean): AppThunk => async (dispatch) => { dispatch(setIsLoading(true)); - try { - // TODO - Modify - const result: - | ErrorResponse - | RemoveHiddenJobSuccessResponse = await fetchServerData( - "/user/hiddenJobs", - "PATCH", - JSON.stringify({ method: "REMOVE", id }) - ); + // TODO - Modify + const url = all ? "/user/logout/all" : "/user/logout"; + const response = await fetchServerData(url, "POST"); - if (isError(result)) { - dispatch(globalErrorHandler(result, true)); - dispatch(setIsLoading(false)); + if (response.error) { + if (response.error !== "Please authenticate.") { + console.error(response.error); + dispatch( + displayNotification( + "Error when attempting to log out. Please try again or contact the developer.", + "error" + ) + ); return; } + } - const { hiddenJobs } = result; + // * Establish Job Data + const jobsResult = (await fetchServerData( + "/jobs", + "POST", + JSON.stringify({ userId: "" }) + )) as ErrorResponse | GetJobsSuccessResponse; - dispatch(setHiddenJobs(hiddenJobs)); - dispatch(displayNotification("Job shown successfully.", "success")); - dispatch(setIsLoading(false)); - } catch (error) { - console.error(error); - dispatch(displayNotification(error, "error")); + if (isError(jobsResult)) { + dispatch(displayNotification(jobsResult.error, "error")); dispatch(setIsLoading(false)); + return; } + + dispatch(displayNotification("", "default")); + dispatch(setCurrentJobs(jobsResult)); + dispatch(setTotalPages(Math.ceil(jobsResult.length / 5))); + dispatch(setEmail("")); + dispatch(setName("")); + dispatch(setId("")); + dispatch(setSavedJobs([])); + dispatch(setHiddenJobs([])); + dispatch(setIsLoggedIn(false)); + dispatch(setIsModalOpen(false)); + dispatch(setModalContent("")); + dispatch(setModalTitle("")); + + dispatch(setIsLoading(false)); }; -export const removeSavedJob = (id: string): AppThunk => async (dispatch) => { +export const removeHiddenJob = (id: string): AppThunk => async (dispatch) => { dispatch(setIsLoading(true)); try { // TODO - Modify const result: | ErrorResponse - | RemoveSavedJobSuccessResponse = await fetchServerData( - "/user/savedJobs", + | RemoveHiddenJobSuccessResponse = await fetchServerData( + "/user/hiddenJobs", "PATCH", JSON.stringify({ method: "REMOVE", id }) ); @@ -570,12 +383,10 @@ export const removeSavedJob = (id: string): AppThunk => async (dispatch) => { return; } - const { savedJobs } = result; + const { hiddenJobs } = result; - dispatch(setSavedJobs(savedJobs)); - dispatch(setSavedJobsCurrentPage(1)); - dispatch(setSavedJobsTotalPages(Math.ceil(savedJobs.length / 5))); - dispatch(displayNotification("Job removed successfully.", "success")); + dispatch(setHiddenJobs(hiddenJobs)); + dispatch(displayNotification("Job shown successfully.", "success")); dispatch(setIsLoading(false)); } catch (error) { console.error(error); @@ -584,36 +395,40 @@ export const removeSavedJob = (id: string): AppThunk => async (dispatch) => { } }; -export const clickViewHiddenJobs = (): AppThunk => (dispatch) => { - dispatch(setCurrentPage(1)); - dispatch(displayNotification("", "default")); - dispatch(setModalContent("hiddenJobs")); - dispatch(setModalTitle("Hidden Jobs")); - dispatch(setIsModalOpen(true)); -}; - -export const clickViewSavedJobs = (): AppThunk => (dispatch) => { - dispatch(setCurrentPage(1)); - dispatch(displayNotification("", "default")); - dispatch(setModalContent("savedJobs")); - dispatch(setModalTitle("Saved Jobs")); - dispatch(setIsModalOpen(true)); -}; - -export const getJobDetails = (id: string): AppThunk => async (dispatch) => { +export const resetPassword = ( + currentPassword: string, + newPassword: string +): AppThunk => async (dispatch) => { dispatch(setIsLoading(true)); dispatch(displayNotification("", "default")); try { - const result: Job = await fetchServerData(`/jobs/${id}`, "GET"); + // TODO - Modify + const response: ResetPasswordResponse = await fetchServerData( + "/user/me", + "PATCH", + JSON.stringify({ + currentPassword, + newPassword, + }) + ); - if (isError(result)) { - dispatch(globalErrorHandler(result, false)); + if (response.error) { + if (response.error === "Please authenticate.") { + // * Clear User and Redirect to Login + dispatch(authenticationRedirect()); + dispatch(setIsLoading(false)); + return; + } + dispatch(displayNotification(response.error, "error")); dispatch(setIsLoading(false)); return; } - dispatch(setJobDetails(result)); + dispatch(displayNotification("Password reset successfully.", "success")); + dispatch(setIsModalOpen(false)); + dispatch(setModalContent("")); + dispatch(setModalTitle("")); dispatch(setIsLoading(false)); } catch (error) { console.error(error); @@ -622,16 +437,16 @@ export const getJobDetails = (id: string): AppThunk => async (dispatch) => { } }; -export const getSavedJobsDetails = (): AppThunk => async (dispatch) => { +export const removeSavedJob = (id: string): AppThunk => async (dispatch) => { dispatch(setIsLoading(true)); - dispatch(displayNotification("", "default")); - try { + // TODO - Modify const result: | ErrorResponse - | GetSavedJobsDetailsSuccessResponse = await fetchServerData( - `/user/savedJobsDetails`, - "GET" + | RemoveSavedJobSuccessResponse = await fetchServerData( + "/user/savedJobs", + "PATCH", + JSON.stringify({ method: "REMOVE", id }) ); if (isError(result)) { @@ -640,7 +455,12 @@ export const getSavedJobsDetails = (): AppThunk => async (dispatch) => { return; } - dispatch(setSavedJobsDetails(result)); + const { savedJobs } = result; + + dispatch(setSavedJobs(savedJobs)); + dispatch(setSavedJobsCurrentPage(1)); + dispatch(setSavedJobsTotalPages(Math.ceil(savedJobs.length / 5))); + dispatch(displayNotification("Job removed successfully.", "success")); dispatch(setIsLoading(false)); } catch (error) { console.error(error); @@ -649,35 +469,39 @@ export const getSavedJobsDetails = (): AppThunk => async (dispatch) => { } }; -export const getHiddenJobsDetails = (): AppThunk => async (dispatch) => { +export const signup = ( + name: string, + email: string, + password: string, + confirmPassword: string +): AppThunk => async (dispatch) => { dispatch(setIsLoading(true)); dispatch(displayNotification("", "default")); - try { - const result: - | ErrorResponse - | GetHiddenJobsDetailsSuccessResponse = await fetchServerData( - `/user/hiddenJobsDetails`, - "GET" - ); + if (confirmPassword !== password) { + dispatch(displayNotification("Passwords do not match.", "error")); + dispatch(setIsLoading(false)); + return; + } - if (isError(result)) { - dispatch(globalErrorHandler(result, true)); - dispatch(setIsLoading(false)); - return; - } + // TODO - Modify + const result: ErrorResponse | SignupSuccessResponse = await fetchServerData( + "/user", + "POST", + JSON.stringify({ confirmPassword, email, name, password }) + ); - dispatch(setHiddenJobsDetails(result)); - dispatch(setIsLoading(false)); - } catch (error) { - console.error(error); - dispatch(displayNotification(error, "error")); + if (isError(result)) { + dispatch(displayNotification(result.error, "error")); dispatch(setIsLoading(false)); + return; } -}; -export const resetModal = (): AppThunk => (dispatch) => { - dispatch(setIsModalOpen(false)); - dispatch(setModalContent("")); - dispatch(setModalTitle("")); + dispatch(setIsLoggedIn(true)); + dispatch(setEmail(result.email)); + dispatch(setName(result.name)); + dispatch(setSavedJobs(result.savedJobs)); + dispatch(setHiddenJobs(result.hiddenJobs)); + + dispatch(setIsLoading(false)); }; diff --git a/src/client/redux/thunks/util.ts b/src/client/redux/thunks/util.ts new file mode 100644 index 0000000..90f8b69 --- /dev/null +++ b/src/client/redux/thunks/util.ts @@ -0,0 +1,42 @@ +import { displayNotification, setRedirectPath } from "../actions/application"; +import { + setIsModalOpen, + setModalContent, + setModalTitle, +} from "../actions/modal"; +import { + setEmail, + setHiddenJobs, + setId, + setName, + setSavedJobs, +} from "../actions/user"; + +import { AppThunk, ErrorResponse } from "../../types"; + +export const authenticationRedirect = (): AppThunk => async (dispatch) => { + dispatch(setRedirectPath("/login")); + dispatch(setEmail("")); + dispatch(setName("")); + dispatch(setId("")); + dispatch(setSavedJobs([])); + dispatch(setHiddenJobs([])); + dispatch(setIsModalOpen(false)); + dispatch(setModalContent("")); + dispatch(setModalTitle("")); + dispatch(displayNotification("Please authenticate.", "error")); +}; + +export const globalErrorHandler = ( + response: ErrorResponse, + authenticatedRequest?: boolean +): AppThunk => (dispatch) => { + if (authenticatedRequest) { + if (response.error === "Please authenticate.") { + // * Clear User and Redirect to Login + dispatch(authenticationRedirect()); + return; + } + } + dispatch(displayNotification(response.error, "error")); +}; From c4070b94c582c5e27acf6584ca35b293778d840b Mon Sep 17 00:00:00 2001 From: alexlee-dev Date: Fri, 21 Aug 2020 09:30:58 -0700 Subject: [PATCH 06/17] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20Refactor=20Thunks=20?= =?UTF-8?q?#103=20-=20Refactor=20Part=203?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Profile/ProfileAccountStats.tsx | 9 ++--- src/client/redux/thunks/application.ts | 26 +----------- src/client/redux/thunks/user.ts | 40 +++++-------------- src/client/redux/thunks/util.ts | 17 ++++++++ src/client/util.ts | 34 ++++++++++++++++ 5 files changed, 66 insertions(+), 60 deletions(-) diff --git a/src/client/components/Profile/ProfileAccountStats.tsx b/src/client/components/Profile/ProfileAccountStats.tsx index 0d26982..4df9b91 100644 --- a/src/client/components/Profile/ProfileAccountStats.tsx +++ b/src/client/components/Profile/ProfileAccountStats.tsx @@ -11,10 +11,7 @@ import { ProfileAccountStatsInnerContainer, } from "./Profile-styled"; -import { - clickViewHiddenJobs, - clickViewSavedJobs, -} from "../../redux/thunks/user"; +import { clickViewJobs } from "../../redux/thunks/user"; import { RootState } from "../../types"; @@ -71,8 +68,8 @@ const mapStateToProps = (state: RootState) => ({ }); const mapDispatchToProps = (dispatch) => ({ - handleClickViewHiddenJobs: () => dispatch(clickViewHiddenJobs()), - handleClickViewSavedJobs: () => dispatch(clickViewSavedJobs()), + handleClickViewHiddenJobs: () => dispatch(clickViewJobs("hidden")), + handleClickViewSavedJobs: () => dispatch(clickViewJobs("saved")), }); export default connect( diff --git a/src/client/redux/thunks/application.ts b/src/client/redux/thunks/application.ts index 039c995..1535342 100644 --- a/src/client/redux/thunks/application.ts +++ b/src/client/redux/thunks/application.ts @@ -24,7 +24,7 @@ import { setName, setSavedJobs, } from "../actions/user"; -import { fetchServerData, isError } from "../../util"; +import { createSearchUrl, fetchServerData, isError } from "../../util"; import { AppThunk, @@ -128,30 +128,8 @@ export const searchJobs = ( dispatch(setSearchValue(search)); const state: RootState = getState(); - const { contract, fullTime, locationSearch } = state.application; - const { id } = state.user; - const locationsSearches = locationOptions.filter( - (location: LocationOption) => location.value !== "" - ); - - if (locationSearch) { - locationsSearches.push({ - name: "locationSearch", - setter: null, - value: locationSearch, - }); - } - - let url = `/jobs/search?userId=${encodeURI(id)}&full_time=${encodeURI( - fullTime.toString() - )}&contract=${encodeURI(contract.toString())}&description=${encodeURI( - search - )}`; - - locationsSearches.forEach((locationSearch: LocationOption, i: number) => { - url = url + `&location${i + 1}=${encodeURI(locationSearch.value)}`; - }); + const url = createSearchUrl(search, locationOptions, state); const data = (await fetchServerData(url, "GET")) as | ErrorResponse diff --git a/src/client/redux/thunks/user.ts b/src/client/redux/thunks/user.ts index 13eab2c..ade6840 100644 --- a/src/client/redux/thunks/user.ts +++ b/src/client/redux/thunks/user.ts @@ -1,4 +1,4 @@ -import { authenticationRedirect, globalErrorHandler } from "./util"; +import { authenticationRedirect, globalErrorHandler, resetState } from "./util"; import { displayNotification, setCurrentJobs, @@ -120,19 +120,13 @@ export const addSavedJob = (id: string): AppThunk => async (dispatch) => { } }; -export const clickViewHiddenJobs = (): AppThunk => (dispatch) => { - dispatch(setCurrentPage(1)); - dispatch(displayNotification("", "default")); - dispatch(setModalContent("hiddenJobs")); - dispatch(setModalTitle("Hidden Jobs")); - dispatch(setIsModalOpen(true)); -}; - -export const clickViewSavedJobs = (): AppThunk => (dispatch) => { +export const clickViewJobs = (type: "hidden" | "saved"): AppThunk => ( + dispatch +) => { dispatch(setCurrentPage(1)); dispatch(displayNotification("", "default")); - dispatch(setModalContent("savedJobs")); - dispatch(setModalTitle("Saved Jobs")); + dispatch(setModalContent(type === "hidden" ? "hiddenJobs" : "savedJobs")); + dispatch(setModalTitle(type === "hidden" ? "Hidden Jobs" : "Saved Jobs")); dispatch(setIsModalOpen(true)); }; @@ -159,16 +153,10 @@ export const deleteProfile = (): AppThunk => async (dispatch) => { return; } + dispatch(resetState()); + dispatch(displayNotification("Profile deleted successfully.", "success")); - dispatch(setEmail("")); - dispatch(setName("")); - dispatch(setSavedJobs([])); - dispatch(setHiddenJobs([])); - dispatch(setIsLoggedIn(false)); dispatch(setIsLoading(false)); - dispatch(setIsModalOpen(false)); - dispatch(setModalContent("")); - dispatch(setModalTitle("")); } catch (error) { console.error(error); dispatch(displayNotification(error, "error")); @@ -349,18 +337,10 @@ export const logOut = (all?: boolean): AppThunk => async (dispatch) => { return; } - dispatch(displayNotification("", "default")); + dispatch(resetState()); + dispatch(setCurrentJobs(jobsResult)); dispatch(setTotalPages(Math.ceil(jobsResult.length / 5))); - dispatch(setEmail("")); - dispatch(setName("")); - dispatch(setId("")); - dispatch(setSavedJobs([])); - dispatch(setHiddenJobs([])); - dispatch(setIsLoggedIn(false)); - dispatch(setIsModalOpen(false)); - dispatch(setModalContent("")); - dispatch(setModalTitle("")); dispatch(setIsLoading(false)); }; diff --git a/src/client/redux/thunks/util.ts b/src/client/redux/thunks/util.ts index 90f8b69..a89bffb 100644 --- a/src/client/redux/thunks/util.ts +++ b/src/client/redux/thunks/util.ts @@ -8,6 +8,7 @@ import { setEmail, setHiddenJobs, setId, + setIsLoggedIn, setName, setSavedJobs, } from "../actions/user"; @@ -40,3 +41,19 @@ export const globalErrorHandler = ( } dispatch(displayNotification(response.error, "error")); }; + +export const resetState = (): AppThunk => (dispatch) => { + // * Application + dispatch(displayNotification("", "default")); + // * Modal + dispatch(setIsModalOpen(false)); + dispatch(setModalContent("")); + dispatch(setModalTitle("")); + // * User + dispatch(setEmail("")); + dispatch(setHiddenJobs([])); + dispatch(setId("")); + dispatch(setIsLoggedIn(false)); + dispatch(setName("")); + dispatch(setSavedJobs([])); +}; diff --git a/src/client/util.ts b/src/client/util.ts index cf88855..5bc147a 100644 --- a/src/client/util.ts +++ b/src/client/util.ts @@ -7,6 +7,8 @@ import { GetJobsSuccessResponse, AddSavedJobSuccessResponse, SignupSuccessResponse, + LocationOption, + RootState, } from "./types"; export const fetchServerData = async ( @@ -70,3 +72,35 @@ export const isError = ( }; export const history = createBrowserHistory(); + +export const createSearchUrl = ( + search: string, + locationOptions: LocationOption[], + state: RootState +): string => { + const { contract, fullTime, locationSearch } = state.application; + const { id } = state.user; + const locationsSearches = locationOptions.filter( + (location: LocationOption) => location.value !== "" + ); + + if (locationSearch) { + locationsSearches.push({ + name: "locationSearch", + setter: null, + value: locationSearch, + }); + } + + let url = `/jobs/search?userId=${encodeURI(id)}&full_time=${encodeURI( + fullTime.toString() + )}&contract=${encodeURI(contract.toString())}&description=${encodeURI( + search + )}`; + + locationsSearches.forEach((locationSearch: LocationOption, i: number) => { + url = url + `&location${i + 1}=${encodeURI(locationSearch.value)}`; + }); + + return url; +}; From 3fb4ba7b1a527f89d8a59db54df8b701c96081eb Mon Sep 17 00:00:00 2001 From: alexlee-dev Date: Fri, 21 Aug 2020 15:36:35 -0700 Subject: [PATCH 07/17] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=94=AC=20Creat?= =?UTF-8?q?e=20Test=20Database=20#91=20-=20Create=20'TestDBController'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/controllers/testDB.ts | 58 +++++++++++++ src/server/index.ts | 2 + src/server/util.ts | 140 +++++++++++++++++++++++++++++++ 3 files changed, 200 insertions(+) create mode 100644 src/server/controllers/testDB.ts diff --git a/src/server/controllers/testDB.ts b/src/server/controllers/testDB.ts new file mode 100644 index 0000000..7114252 --- /dev/null +++ b/src/server/controllers/testDB.ts @@ -0,0 +1,58 @@ +import express, { Request, Response, Router } from "express"; + +import JobModel from "../models/Job"; + +import { ErrorResponse, Job } from "../types"; +import { generateFakeJob } from "../util"; + +/** + * Test DB Controller. + */ +class TestDBController { + public router: Router = express.Router(); + + constructor() { + this.initializeRoutes(); + } + + public initializeRoutes(): void { + this.router.get( + "/populateDB", + async ( + req: Request, + res: Response + ): Promise> => { + if (process.env.NODE_ENV !== "test") { + return res.status(500).send({ error: "Invalid environment." }); + } + + try { + // * Drop current db of fake jobs + await JobModel.collection.drop(); + + // * Generate 50 Jobs + const fakeJobs: Job[] = []; + for (let i = 0; i < 50; i++) { + fakeJobs.push(generateFakeJob(i)); + } + + // * Create 50 new jobs in DB + await Promise.all( + fakeJobs.map(async (job: Job) => { + const newJob = new JobModel(job); + await newJob.save(); + return; + }) + ); + + return res.send(fakeJobs); + } catch (error) { + console.error(error); + res.status(500).send({ error }); + } + } + ); + } +} + +export default TestDBController; diff --git a/src/server/index.ts b/src/server/index.ts index c51e891..fb134f0 100644 --- a/src/server/index.ts +++ b/src/server/index.ts @@ -5,6 +5,7 @@ import AssetsController from "./controllers/assets"; import JobController from "./controllers/job"; import ScriptsController from "./controllers/scripts"; import UserController from "./controllers/user"; +import TestDBController from "./controllers/testDB"; import { checkIfMongoDBIsRunning } from "./util"; @@ -40,6 +41,7 @@ const main = async (): Promise => { new JobController(), new ScriptsController(), new UserController(), + new TestDBController(), ], process.env.PORT ); diff --git a/src/server/util.ts b/src/server/util.ts index 069c57a..36fb018 100644 --- a/src/server/util.ts +++ b/src/server/util.ts @@ -117,3 +117,143 @@ export const rehydrateJobsDB = async (): Promise => { console.error(error); } }; + +// eslint-disable-next-line +const randomItem = (arr: any[]): any => arr[(Math.random() * arr.length) | 0]; + +const fakeCompanies = [ + "Stokes Group", + "Dibbert, Schumm and Heathcote", + "Schneider Group", + "Goyette-Bailey", + "Bogisich, Nienow and Berge", + "Brakus-Wisoky", + "Kutch and Sons", + "Kunze-Ratke", + "Breitenberg LLC", + "Wolff, Vandervort and Towne", + "Gutmann-Kub", + "Schmidt, Stroman and Wehner", + "Cummerata and Sons", + "Bernier and Sons", + "Glover, Corwin and Gislason", + "Miller, Parker and Jast", + "Hickle-Cole", + "Witting Group", + "Kreiger Group", + "Emard-Kub", + "Homenick, Huel and Schmitt", + "Fahey-Bosco", + "Bayer-Spinka", + "Lesch Inc", + "Kling, Robel and Witting", + "Schimmel, Abshire and Ward", + "Bartoletti, Fay and Howe", + "Eichmann, Barrows and Considine", + "Fadel Group", + "D'Amore, Jones and Stroman", + "Stoltenberg Inc", + "Bruen, Koss and Sipes", + "Bernier LLC", + "Waelchi LLC", + "Hermiston, Wiza and Reynolds", + "Huel-Lockman", + "Schamberger Group", + "Heller-Spencer", + "Kuvalis, Pfannerstill and Greenfelder", + "Bradtke, Herman and Stracke", + "Romaguera and Sons", + "Hayes, Runte and Rau", + "Jakubowski-Smith", + "Hoeger-Barrows", + "Zieme, Price and Gleason", + "Wiegand, Aufderhar and Bode", + "Herman LLC", + "Carter, Kassulke and McLaughlin", + "Beatty-Bashirian", + "Dickens LLC", +]; + +const locations = [ + "Buritizeiro", + "Acopampa", + "Gorzyce", + "Radomin", + "Moutsamoudou", + "Lebedyn", + "Huité", + "Kakhovka", + "Leonidovo", + "Rates", + "Kepuh", + "Lembursawah", + "Pasirangin Tiga", + "Rio Bonito", + "Al ‘Alamayn", + "Amvrosiyivka", + "Bicesse", + "Consuelo", + "Ţayyibat al Imām", + "Curahnongko", + "Pucyura", + "Rawa", + "Limoges", + "Madrid", + "Dikwa", + "Pilar", + "El Cubolero", + "Savalou", + "Latacunga", + "Malapaubhara", + "Detroit", + "Brinkmann", + "Zaoshi", + "Nangang", + "Medan", + "Salcedo", + "Kandana", + "Koniaków", + "Parys", + "Mlanggeng", + "Radlje ob Dravi", + "Cishan", + "Babantar", + "Fāqūs", + "Kuteynykove", + "Oravais", + "Ikšķile", + "Sanli", + "Portela", + "Wuxue Shi", +]; + +const titles = [ + "Full Stack Developer", + "Web Developer", + "Mobile Developer", + "Software Engineer", + "UX Lead", + "UI Lead", + "Senior Developer", + "Junior Developer", +]; + +const types = ["Full Time", "Contract"]; + +export const generateFakeJob = (index: number): Job => { + const job = { + company: randomItem(fakeCompanies), + company_logo: "https://dummyimage.com/399x399.png/6469ff/ffffff", + company_url: "https://www.google.com/", + description: + "

On the other hand, we denounce with righteous indignation and dislike men who are so beguiled and demoralized by the charms of pleasure of the moment, so blinded by desire, that they cannot foresee the pain and trouble that are bound to ensue; and equal blame belongs to those who fail in their duty through weakness of will, which is the same as saying through shrinking from toil and pain. These cases are perfectly simple and easy to distinguish. In a free hour, when our power of choice is untrammelled and when nothing prevents our being able to do what we like best, every pleasure is to be welcomed and every pain avoided. But in certain circumstances and owing to the claims of duty or the obligations of business it will frequently occur that pleasures have to be repudiated and annoyances accepted. The wise man therefore always holds in these matters to this principle of selection: he rejects pleasures to secure other greater pleasures, or else he endures pains to avoid worse pains.

\n", + how_to_apply: '', + id: index.toString(), + listingDate: "Thu Jul 4 12:00:00 UTC 1776", + location: randomItem(locations), + title: randomItem(titles), + type: randomItem(types), + url: "https://www.google.com/", + }; + return job; +}; From 5dac413f92bf540af6c79ebef3003414b339615c Mon Sep 17 00:00:00 2001 From: alexlee-dev Date: Fri, 21 Aug 2020 16:45:57 -0700 Subject: [PATCH 08/17] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=94=AC=20Creat?= =?UTF-8?q?e=20Test=20Database=20#91=20-=20Adjust=20tests=20for=20regressi?= =?UTF-8?q?on=20and=20unstubbing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cypress/integration/applicationError.spec.js | 40 +++--- cypress/integration/authentication.spec.js | 15 +- cypress/integration/details.spec.js | 32 ++--- cypress/integration/directPageAccess.spec.js | 26 +--- cypress/integration/hiddenJobs.spec.js | 136 +++++++------------ cypress/integration/login.spec.js | 29 ---- cypress/integration/notification.spec.js | 10 -- cypress/integration/optionsPanel.spec.js | 81 +---------- cypress/integration/profile.spec.js | 10 -- cypress/integration/savedJobs.spec.js | 108 ++++----------- cypress/integration/search.spec.js | 27 ++-- cypress/integration/signup.spec.js | 39 ++---- 12 files changed, 131 insertions(+), 422 deletions(-) diff --git a/cypress/integration/applicationError.spec.js b/cypress/integration/applicationError.spec.js index c03f2ef..2dea7f7 100644 --- a/cypress/integration/applicationError.spec.js +++ b/cypress/integration/applicationError.spec.js @@ -7,29 +7,21 @@ context("Application Error", () => { return false; }); beforeEach(() => { - cy.fixture("jobs50").then((jobsJson) => { - cy.server(); - cy.route({ - method: "POST", - url: "/jobs", - status: 200, - response: jobsJson, - delay: 1000, - }); - cy.route({ - method: "GET", - url: "/jobs/search?userId=&full_time=false&contract=false&description=react", - status: 200, - response: {}, - delay: 1000, - }); - cy.route({ - method: "GET", - url: "/jobs/f1884b46-ecb4-473c-81f5-08d9bf2ab3bb", - status: 200, - response: {}, - delay: 1000, - }); + cy.server(); + cy.route({ + method: "GET", + url: + "/jobs/search?userId=&full_time=false&contract=false&description=react", + status: 200, + response: {}, + delay: 1000, + }); + cy.route({ + method: "GET", + url: "/jobs/7", + status: 200, + response: {}, + delay: 1000, }); cy.visit("http://localhost:3000"); cy.wait(500); @@ -61,7 +53,7 @@ context("Application Error", () => { }); it("Should push app to '/' when 'Try again' button is clicked", () => { - cy.get("#f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").click({ force: true }); + cy.get("#\\37").click({ force: true }); cy.wait(1000); cy.get("#try-again").click(); diff --git a/cypress/integration/authentication.spec.js b/cypress/integration/authentication.spec.js index 90ece37..7c87191 100644 --- a/cypress/integration/authentication.spec.js +++ b/cypress/integration/authentication.spec.js @@ -2,17 +2,6 @@ context("Authentication", () => { beforeEach(() => { - cy.fixture("jobs50").then((jobsJson) => { - cy.server(); - cy.route({ - method: "POST", - url: "/jobs", - status: 200, - response: jobsJson, - delay: 1000, - }); - }); - // * Login cy.visit("http://localhost:3000"); cy.wait(1000); @@ -135,10 +124,10 @@ context("Authentication", () => { }); // ! Can't implement this until you create a Test Database with Test Jobs - it.skip("Should redirect to '/login' when user attempts to show a hidden job on their profile after becoming unauthenticated", () => {}); + it("Should redirect to '/login' when user attempts to show a hidden job on their profile after becoming unauthenticated", () => {}); // ! Can't implement this until you create a Test Database with Test Jobs - it.skip("Should redirect to '/login' when user attempts to hide a saved job on their profile after becoming unauthenticated", () => {}); + it("Should redirect to '/login' when user attempts to hide a saved job on their profile after becoming unauthenticated", () => {}); }); context("Authentication - Search Page", () => { diff --git a/cypress/integration/details.spec.js b/cypress/integration/details.spec.js index ee43985..4cfb7aa 100644 --- a/cypress/integration/details.spec.js +++ b/cypress/integration/details.spec.js @@ -2,35 +2,19 @@ context("Details", () => { beforeEach(() => { - cy.fixture("jobs50").then((jobsJson) => { - cy.fixture("jobDetails").then((jobDetails) => { - cy.server(); - cy.route({ - method: "POST", - url: "/jobs", - status: 200, - response: jobsJson, - delay: 1000, - }); - cy.route({ - method: "GET", - url: "/jobs/f1884b46-ecb4-473c-81f5-08d9bf2ab3bb", - status: 200, - response: jobDetails, - delay: 1000, - }); - }); - }); cy.visit("http://localhost:3000"); cy.wait(500); - cy.get("#f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").click({ force: true }); + cy.get("#\\37").click({ force: true }); }); it("Should display '
' correctly", () => { cy.get("#how-to-label").should("have.text", "How to Apply"); - cy.get("#details-title").should("have.text", "Cloud DevOps Engineer"); - cy.get("#full-time-indicator").should("have.text", "Full Time"); - cy.get("#details-company-name").should("have.text", "Cool Company"); + cy.get("#details-title").should("have.text", "Software Engineer"); + cy.get("#full-time-indicator").should("not.exist"); + cy.get("#details-company-name").should( + "have.text", + "D'Amore, Jones and Stroman" + ); }); it("Should be able to return to ''", () => { @@ -39,7 +23,7 @@ context("Details", () => { cy.get("#back-to-search").click(); cy.get("#search").should("be.visible"); - cy.get("#f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").click({ force: true }); + cy.get("#\\37").click({ force: true }); cy.get("#search").should("not.be.visible"); cy.get("header").click(); diff --git a/cypress/integration/directPageAccess.spec.js b/cypress/integration/directPageAccess.spec.js index 7027ee8..17a84b9 100644 --- a/cypress/integration/directPageAccess.spec.js +++ b/cypress/integration/directPageAccess.spec.js @@ -1,28 +1,6 @@ /// context("Direct Page Access", () => { - beforeEach(() => { - cy.fixture("jobs50").then((jobsJson) => { - cy.fixture("jobDetails").then((jobDetailsJson) => { - cy.server(); - cy.route({ - method: "POST", - url: "/jobs", - status: 200, - response: jobsJson, - delay: 1000, - }); - cy.route({ - method: "GET", - url: "/jobs/f1884b46-ecb4-473c-81f5-08d9bf2ab3bb", - status: 200, - response: jobDetailsJson, - delay: 1000, - }); - }); - }); - }); - it("Should be able to access '/login/ directly", () => { cy.visit("http://localhost:3000/login"); cy.wait(500); @@ -38,9 +16,9 @@ context("Direct Page Access", () => { }); it("Should be able to access '/jobDetails/:id' directly", () => { - cy.visit("http://localhost:3000/jobDetails/f1884b46-ecb4-473c-81f5-08d9bf2ab3bb"); + cy.visit("http://localhost:3000/jobDetails/7"); cy.wait(500); - cy.get("h2").should("have.text", "Cloud DevOps Engineer"); + cy.get("h2").should("have.text", "Software Engineer"); }); }); diff --git a/cypress/integration/hiddenJobs.spec.js b/cypress/integration/hiddenJobs.spec.js index fd55f8a..00b9c72 100644 --- a/cypress/integration/hiddenJobs.spec.js +++ b/cypress/integration/hiddenJobs.spec.js @@ -2,33 +2,15 @@ context("Hidden Jobs", () => { beforeEach(() => { - cy.fixture("jobs50").then((jobsJson) => { - cy.fixture("hiddenDetails").then((hiddenDetailsJson) => { - cy.fixture("jobDetails").then((jobDetailsJson) => { - cy.server(); - cy.route({ - method: "POST", - url: "/jobs", - status: 200, - response: jobsJson, - delay: 1000, - }); - cy.route({ - method: "GET", - url: "/user/hiddenJobsDetails", - status: 200, - response: hiddenDetailsJson, - delay: 1000, - }); - cy.route({ - method: "GET", - url: "/jobs/f1884b46-ecb4-473c-81f5-08d9bf2ab3bb", - status: 200, - response: jobDetailsJson, - delay: 1000, - }); - }); - }); + cy.fixture("hiddenDetails").then((hiddenDetailsJson) => { + cy.server(); + // cy.route({ + // method: "GET", + // url: "/user/hiddenJobsDetails", + // status: 200, + // response: hiddenDetailsJson, + // delay: 1000, + // }); }); cy.visit("http://localhost:3000"); cy.wait(500); @@ -44,59 +26,51 @@ context("Hidden Jobs", () => { }); it("Should be able to hide a job from the 'Search' page", () => { - cy.get("#hide-job-f1884b46-ecb4-473c-81f5-08d9bf2ab3bb") - .its("data") - .should("be", '{ cy: "deselected" }'); - cy.get("#hide-job-f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").click(); + cy.get("#hide-job-7").its("data").should("be", '{ cy: "deselected" }'); + cy.get("#hide-job-7").click(); cy.get("#notification").should("have.text", "Job hidden successfully."); cy.get("#notification > button").click(); // * Cleanup cy.get("#nav-profile").click(); cy.get("#view-hidden-jobs").click(); - cy.get("#show-job-f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").click(); + cy.get("#show-job-7").click(); cy.get("#notification").should("have.text", "Job shown successfully."); cy.get("#notification > button").click(); }); it("Should be able to hide a job from the 'Details' page", () => { - cy.get("#f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").click({ force: true }); - - cy.get("#hide-job-f1884b46-ecb4-473c-81f5-08d9bf2ab3bb") - .its("data") - .should("be", "{cy: 'deselected'}"); - cy.get("#hide-job-f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").click(); - cy.get("#show-job-f1884b46-ecb4-473c-81f5-08d9bf2ab3bb") - .its("data") - .should("be", "{ cy: 'selected' }"); + cy.get("#\\37").click({ force: true }); + + cy.get("#hide-job-7").its("data").should("be", "{cy: 'deselected'}"); + cy.get("#hide-job-7").click(); + cy.get("#show-job-7").its("data").should("be", "{ cy: 'selected' }"); cy.get("#notification").should("have.text", "Job hidden successfully."); cy.get("#notification > button").click(); // * Cleanup - cy.get("#show-job-f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").click(); + cy.get("#show-job-7").click(); cy.get("#notification").should("have.text", "Job shown successfully."); cy.get("#notification > button").click(); }); it("Should be able to view list of hidden jobs", () => { - cy.get("#hide-job-f1884b46-ecb4-473c-81f5-08d9bf2ab3bb") - .its("data") - .should("be", "{ cy: 'deselected' }"); - cy.get("#hide-job-f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").click(); + cy.get("#hide-job-7").its("data").should("be", "{ cy: 'deselected' }"); + cy.get("#hide-job-7").click(); cy.get("#notification").should("have.text", "Job hidden successfully."); cy.get("#notification > button").click(); cy.get("#nav-profile").click(); cy.get("#view-hidden-jobs").click(); cy.get("#modal-title").should("have.text", "Hidden Jobs"); - cy.get("#f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").should("exist"); + cy.get("#\\37").should("exist"); // * Cleanup - cy.get("#show-job-f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").click(); + cy.get("#show-job-7").click(); }); it("Should be able to return to the profile page", () => { - cy.get("#hide-job-f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").click(); + cy.get("#hide-job-7").click(); cy.get("#nav-profile").click(); cy.get("#view-hidden-jobs").click(); @@ -107,7 +81,7 @@ context("Hidden Jobs", () => { // * Cleanup cy.get("#view-hidden-jobs").click(); - cy.get("#show-job-f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").click(); + cy.get("#show-job-7").click(); }); // ! Unable to do with current implementation @@ -115,9 +89,9 @@ context("Hidden Jobs", () => { // * If you do stub it, you can't conditionally send a smaller list of jobs each time it hits /user/hiddenJobDetails it.skip("Should display currentPage as '1' when viewing hiddenJobs", () => { // * Hide 6 jobs - cy.get("#hide-job-f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").click(); - cy.get("#hide-job-72de09f2-5bc6-489f-be90-3d38e505e20a").click(); - cy.get("#hide-job-cc20d9f2-0102-4785-8253-66093d3ca5c0").click(); + cy.get("#hide-job-7").click(); + cy.get("#hide-job-4").click(); + cy.get("#hide-job-1").click(); cy.get("#hide-job-65ed6c1f-e74e-47ed-a85f-126ef1071a47").click(); cy.get("#hide-job-285aa472-990f-418d-b376-e03c27f48d17").click(); cy.get("#hide-job-11cbce13-e6cd-4c79-b904-d292b569b22f").click(); @@ -135,29 +109,25 @@ context("Hidden Jobs", () => { ); // * Cleanup - cy.get("#show-job-f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").click(); - cy.get("#show-job-72de09f2-5bc6-489f-be90-3d38e505e20a").click(); - cy.get("#show-job-cc20d9f2-0102-4785-8253-66093d3ca5c0").click(); + cy.get("#show-job-7").click(); + cy.get("#show-job-4").click(); + cy.get("#show-job-1").click(); cy.get("#show-job-65ed6c1f-e74e-47ed-a85f-126ef1071a47").click(); cy.get("#show-job-285aa472-990f-418d-b376-e03c27f48d17").click(); cy.get("#show-job-11cbce13-e6cd-4c79-b904-d292b569b22f").click(); }); it("Should hide the job from the list of current jobs when user hides job", () => { - cy.get("#hide-job-f1884b46-ecb4-473c-81f5-08d9bf2ab3bb") - .its("data") - .should("be", '{ cy: "deselected" }'); - cy.get("#hide-job-f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").click(); - cy.get("#show-job-f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").should( - "not.exist" - ); + cy.get("#hide-job-7").its("data").should("be", '{ cy: "deselected" }'); + cy.get("#hide-job-7").click(); + cy.get("#show-job-7").should("not.exist"); cy.get("#notification").should("have.text", "Job hidden successfully."); cy.get("#notification > button").click(); // * Cleanup cy.get("#nav-profile").click(); cy.get("#view-hidden-jobs").click(); - cy.get("#show-job-f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").click(); + cy.get("#show-job-7").click(); cy.get("#notification").should("have.text", "Job shown successfully."); cy.get("#notification > button").click(); }); @@ -167,9 +137,9 @@ context("Hidden Jobs", () => { // * If you do stub it, you can't conditionally send a smaller list of jobs each time it hits /user/hiddenJobDetails it.skip("Should display pagination correctly", () => { // * Hide 6 jobs - cy.get("#hide-job-f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").click(); - cy.get("#hide-job-72de09f2-5bc6-489f-be90-3d38e505e20a").click(); - cy.get("#hide-job-cc20d9f2-0102-4785-8253-66093d3ca5c0").click(); + cy.get("#hide-job-7").click(); + cy.get("#hide-job-4").click(); + cy.get("#hide-job-1").click(); cy.get("#hide-job-65ed6c1f-e74e-47ed-a85f-126ef1071a47").click(); cy.get("#hide-job-285aa472-990f-418d-b376-e03c27f48d17").click(); cy.get("#hide-job-11cbce13-e6cd-4c79-b904-d292b569b22f").click(); @@ -192,15 +162,15 @@ context("Hidden Jobs", () => { }); // * Remove 1 job (now should be 1 page instead of 2 pages) - cy.get("#show-job-f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").click(); + cy.get("#show-job-7").click(); cy.get("[data-cy=pagination-list]").then(($paginationList) => { assert.equal($paginationList.children().length, 3); }); // * Cleanup - cy.get("#show-job-72de09f2-5bc6-489f-be90-3d38e505e20a").click(); - cy.get("#show-job-cc20d9f2-0102-4785-8253-66093d3ca5c0").click(); + cy.get("#show-job-4").click(); + cy.get("#show-job-1").click(); cy.get("#show-job-65ed6c1f-e74e-47ed-a85f-126ef1071a47").click(); cy.get("#show-job-285aa472-990f-418d-b376-e03c27f48d17").click(); cy.get("#show-job-11cbce13-e6cd-4c79-b904-d292b569b22f").click(); @@ -208,29 +178,27 @@ context("Hidden Jobs", () => { it("Should not display hidden jobs when page reloads", () => { // * Hide 3 jobs - cy.get("#hide-job-f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").click(); - cy.get("#hide-job-72de09f2-5bc6-489f-be90-3d38e505e20a").click(); - cy.get("#hide-job-cc20d9f2-0102-4785-8253-66093d3ca5c0").click(); + cy.get("#hide-job-7").click(); + cy.get("#hide-job-4").click(); + cy.get("#hide-job-1").click(); cy.reload(); // * Hidden Jobs should not display - cy.get("#show-job-f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").should( - "not.exist" - ); - cy.get("#show-job-72de09f2-5bc6-489f-be90-3d38e505e20a").should( + cy.get("#show-job-7").should("not.exist"); + cy.get("#show-job-4").should( "not.exist" ); - cy.get("#show-job-cc20d9f2-0102-4785-8253-66093d3ca5c0").should( + cy.get("#show-job-1").should( "not.exist" ); // * Cleanup cy.get("#nav-profile").click(); cy.get("#view-hidden-jobs").click(); - cy.get("#show-job-f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").click(); - cy.get("#show-job-72de09f2-5bc6-489f-be90-3d38e505e20a").click(); - cy.get("#show-job-cc20d9f2-0102-4785-8253-66093d3ca5c0").click(); + cy.get("#show-job-7").click(); + cy.get("#show-job-4").click(); + cy.get("#show-job-1").click(); }); // ! Unable to do with current implementation @@ -238,13 +206,13 @@ context("Hidden Jobs", () => { // * If you do stub it, you can't conditionally send a smaller list of jobs each time it hits /user/hiddenJobDetails it.skip("Should not display hidden jobs in currentJobs", () => { // * Hide a job - cy.get("#hide-job-f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").click(); + cy.get("#hide-job-7").click(); // * Log User out cy.get("#nav-profile").click(); cy.get("#settings").click(); cy.get("#log-out").click(); - cy.get("#f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").should("exist"); + cy.get("#\\37").should("exist"); // * Log In cy.get("#nav-login").click(); @@ -253,7 +221,7 @@ context("Hidden Jobs", () => { cy.get("#log-in").click(); cy.wait(500); - cy.get("#f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").should("not.exist"); + cy.get("#\\37").should("not.exist"); }); // ! Can't do this until you create a Test Database diff --git a/cypress/integration/login.spec.js b/cypress/integration/login.spec.js index 50901bb..632be94 100644 --- a/cypress/integration/login.spec.js +++ b/cypress/integration/login.spec.js @@ -2,25 +2,6 @@ context("Login - Success", () => { beforeEach(() => { - cy.fixture("jobs50").then((jobsJson) => { - cy.fixture("login").then((loginJson) => { - cy.server(); - cy.route({ - method: "POST", - url: "/jobs", - status: 200, - response: jobsJson, - delay: 1000, - }); - cy.route({ - method: "POST", - url: "/user/login", - status: 200, - response: loginJson, - delay: 1000, - }); - }); - }); cy.visit("http://localhost:3000"); cy.wait(500); cy.get("#nav-login").click(); @@ -45,16 +26,6 @@ context("Login - Success", () => { context("Login - Error", () => { beforeEach(() => { - cy.fixture("jobs50").then((jobsJson) => { - cy.server(); - cy.route({ - method: "POST", - url: "/jobs", - status: 200, - response: jobsJson, - delay: 1000, - }); - }); cy.visit("http://localhost:3000"); cy.wait(500); cy.get("#nav-login").click(); diff --git a/cypress/integration/notification.spec.js b/cypress/integration/notification.spec.js index 599b8f6..ec4cc7d 100644 --- a/cypress/integration/notification.spec.js +++ b/cypress/integration/notification.spec.js @@ -2,16 +2,6 @@ context("Notification", () => { beforeEach(() => { - cy.fixture("jobs50").then((jobsJson) => { - cy.server(); - cy.route({ - method: "POST", - url: "/jobs", - status: 200, - response: jobsJson, - delay: 1000, - }); - }); cy.visit("http://localhost:3000"); cy.wait(500); }); diff --git a/cypress/integration/optionsPanel.spec.js b/cypress/integration/optionsPanel.spec.js index 2f253cb..05f7373 100644 --- a/cypress/integration/optionsPanel.spec.js +++ b/cypress/integration/optionsPanel.spec.js @@ -2,69 +2,6 @@ context("Options Panel", () => { beforeEach(() => { - cy.fixture("jobs50").then((jobsJson) => { - cy.fixture("jobsSearch1").then((jobsSearch1Json) => { - cy.fixture("jobsSearch2").then((jobsSearch2Json) => { - cy.fixture("jobsSearch3").then((jobsSearch3Json) => { - cy.server(); - cy.route({ - method: "POST", - url: "/jobs", - status: 200, - response: jobsJson, - }); - cy.route({ - method: "GET", - url: - "/jobs/search?userId=&full_time=true&contract=false&description=developer", - status: 200, - delay: 1000, - response: jobsSearch2Json, - }); - cy.route({ - method: "GET", - url: - "/jobs/search?userId=&full_time=false&contract=false&description=&location1=Los Angeles", - status: 200, - delay: 1000, - response: jobsSearch1Json, - }); - cy.route({ - method: "GET", - url: - "/jobs/search?userId=&full_time=false&contract=false&description=&location1=Chicago", - status: 200, - delay: 1000, - response: jobsSearch1Json, - }); - cy.route({ - method: "GET", - url: - "/jobs/search?userId=&full_time=false&contract=false&description=developer", - status: 200, - delay: 1000, - response: jobsSearch1Json, - }); - cy.route({ - method: "GET", - url: - "/jobs/search?userId=&full_time=false&contract=false&description=&location1=Los Angeles", - status: 200, - delay: 1000, - response: jobsSearch1Json, - }); - cy.route({ - method: "GET", - url: - "/jobs/search?userId=&full_time=false&contract=true&description=developer", - status: 200, - delay: 1000, - response: jobsSearch3Json, - }); - }); - }); - }); - }); cy.visit("http://localhost:3000"); }); @@ -100,17 +37,13 @@ context("Options Panel", () => { cy.get("#search-submit").click(); cy.wait(1000); - cy.get('[data-cy="job-container"]').then(($jobs) => { - assert.equal($jobs.length, 5); - }); + cy.get("#notification").should("have.text", "Search returned 30 results."); cy.get(":nth-child(1) > [data-cy=checkmark]").click(); cy.get("#search-submit").click(); cy.wait(1000); - cy.get('[data-cy="job-container"]').then(($jobs) => { - assert.equal($jobs.length, 4); - }); + cy.get("#notification").should("have.text", "Search returned 17 results."); }); it("Should filter with contract correctly", () => { @@ -118,17 +51,13 @@ context("Options Panel", () => { cy.get("#search-submit").click(); cy.wait(1000); - cy.get('[data-cy="job-container"]').then(($jobs) => { - assert.equal($jobs.length, 5); - }); + cy.get("#notification").should("have.text", "Search returned 30 results."); cy.get(":nth-child(2) > [data-cy=checkmark]").click(); cy.get("#search-submit").click(); cy.wait(1000); - cy.get('[data-cy="job-container"]').then(($jobs) => { - assert.equal($jobs.length, 3); - }); + cy.get("#notification").should("have.text", "Search returned 13 results."); }); it("Should be able to search within the OptionsPanel", () => { @@ -136,6 +65,6 @@ context("Options Panel", () => { cy.get("#options-panel-search").click(); cy.wait(1000); - cy.get("#notification").should("have.text", "Search returned 7 results."); + cy.get("#notification").should("have.text", "Search returned 5 results."); }); }); diff --git a/cypress/integration/profile.spec.js b/cypress/integration/profile.spec.js index ec6eec3..123a90d 100644 --- a/cypress/integration/profile.spec.js +++ b/cypress/integration/profile.spec.js @@ -2,16 +2,6 @@ context("Profile", () => { beforeEach(() => { - cy.fixture("jobs50").then((jobsJson) => { - cy.server(); - cy.route({ - method: "POST", - url: "/jobs", - status: 200, - response: jobsJson, - delay: 1000, - }); - }); cy.visit("http://localhost:3000"); cy.get("#nav-login").click(); cy.get("#email").type("bobtest@email.com"); diff --git a/cypress/integration/savedJobs.spec.js b/cypress/integration/savedJobs.spec.js index 108147e..020a8f5 100644 --- a/cypress/integration/savedJobs.spec.js +++ b/cypress/integration/savedJobs.spec.js @@ -2,34 +2,6 @@ context("Saved Jobs", () => { beforeEach(() => { - cy.fixture("jobs50").then((jobsJson) => { - cy.fixture("savedDetails").then((savedDetailsJson) => { - cy.fixture("jobDetails").then((jobDetailsJson) => { - cy.server(); - cy.route({ - method: "POST", - url: "/jobs", - status: 200, - response: jobsJson, - delay: 1000, - }); - cy.route({ - method: "GET", - url: "/user/savedJobsDetails", - status: 200, - response: savedDetailsJson, - delay: 1000, - }); - cy.route({ - method: "GET", - url: "/jobs/f1884b46-ecb4-473c-81f5-08d9bf2ab3bb", - status: 200, - response: jobDetailsJson, - delay: 1000, - }); - }); - }); - }); cy.visit("http://localhost:3000"); cy.wait(500); cy.get("#nav-login").click(); @@ -44,63 +16,51 @@ context("Saved Jobs", () => { }); it("Should be able to save a job from the 'Search' page", () => { - cy.get("#save-job-f1884b46-ecb4-473c-81f5-08d9bf2ab3bb") - .its("data") - .should("be", '{ cy: "deselected" }'); - cy.get("#save-job-f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").click(); - cy.get("#remove-job-f1884b46-ecb4-473c-81f5-08d9bf2ab3bb") - .its("data") - .should("be", "{ cy: 'selected' }"); + cy.get("#save-job-7").its("data").should("be", '{ cy: "deselected" }'); + cy.get("#save-job-7").click(); + cy.get("#remove-job-7").its("data").should("be", "{ cy: 'selected' }"); cy.get("#notification").should("have.text", "Job saved successfully."); cy.get("#notification > button").click(); // * Cleanup - cy.get("#remove-job-f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").click(); + cy.get("#remove-job-7").click(); cy.get("#notification").should("have.text", "Job removed successfully."); cy.get("#notification > button").click(); }); it("Should be able to save a job from the 'Details' page", () => { - cy.get("#f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").click({ force: true }); - - cy.get("#save-job-f1884b46-ecb4-473c-81f5-08d9bf2ab3bb") - .its("data") - .should("be", "{cy: 'deselected'}"); - cy.get("#save-job-f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").click(); - cy.get("#remove-job-f1884b46-ecb4-473c-81f5-08d9bf2ab3bb") - .its("data") - .should("be", "{ cy: 'selected' }"); + cy.get("#\\37").click({ force: true }); + + cy.get("#save-job-7").its("data").should("be", "{cy: 'deselected'}"); + cy.get("#save-job-7").click(); + cy.get("#remove-job-7").its("data").should("be", "{ cy: 'selected' }"); cy.get("#notification").should("have.text", "Job saved successfully."); cy.get("#notification > button").click(); // * Cleanup - cy.get("#remove-job-f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").click(); + cy.get("#remove-job-7").click(); cy.get("#notification").should("have.text", "Job removed successfully."); cy.get("#notification > button").click(); }); it("Should be able to view list of saved jobs", () => { - cy.get("#save-job-f1884b46-ecb4-473c-81f5-08d9bf2ab3bb") - .its("data") - .should("be", "{ cy: 'deselected' }"); - cy.get("#save-job-f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").click(); - cy.get("#remove-job-f1884b46-ecb4-473c-81f5-08d9bf2ab3bb") - .its("data") - .should("be", '{ cy: "selected" }'); + cy.get("#save-job-7").its("data").should("be", "{ cy: 'deselected' }"); + cy.get("#save-job-7").click(); + cy.get("#remove-job-7").its("data").should("be", '{ cy: "selected" }'); cy.get("#notification").should("have.text", "Job saved successfully."); cy.get("#notification > button").click(); cy.get("#nav-profile").click(); cy.get("#view-saved-jobs").click(); cy.get("#modal-title").should("have.text", "Saved Jobs"); - cy.get("#f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").should("exist"); + cy.get("#\\37").should("exist"); // * Cleanup - cy.get("#remove-job-f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").click(); + cy.get("#remove-job-7").click(); }); it("Should be able to return to the profile display page", () => { - cy.get("#save-job-f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").click(); + cy.get("#save-job-7").click(); cy.get("#nav-profile").click(); cy.get("#view-saved-jobs").click(); @@ -111,18 +71,18 @@ context("Saved Jobs", () => { // * Cleanup cy.get("#view-saved-jobs").click(); - cy.get("#remove-job-f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").click(); + cy.get("#remove-job-7").click(); }); it("Should display currentPage as '1' when viewing savedJobs", () => { // * Save 6 jobs - cy.get("#save-job-f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").click(); - cy.get("#save-job-72de09f2-5bc6-489f-be90-3d38e505e20a").click(); - cy.get("#save-job-cc20d9f2-0102-4785-8253-66093d3ca5c0").click(); - cy.get("#save-job-65ed6c1f-e74e-47ed-a85f-126ef1071a47").click(); - cy.get("#save-job-285aa472-990f-418d-b376-e03c27f48d17").click(); + cy.get("#save-job-7").click(); + cy.get("#save-job-4").click(); + cy.get("#save-job-1").click(); + cy.get("#save-job-8").click(); + cy.get("#save-job-9").click(); cy.get("[data-cy=pagination-list] > :nth-child(3) > button").click(); - cy.get("#save-job-11cbce13-e6cd-4c79-b904-d292b569b22f").click(); + cy.get("#save-job-2").click(); // * View Saved Jobs cy.get("#nav-profile").click(); @@ -139,28 +99,18 @@ context("Saved Jobs", () => { // * Cleanup cy.get("#modal-close").click(); cy.get("header").click(); - cy.get("#remove-job-f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").click(); - cy.get("#remove-job-72de09f2-5bc6-489f-be90-3d38e505e20a").click(); - cy.get("#remove-job-cc20d9f2-0102-4785-8253-66093d3ca5c0").click(); - cy.get("#remove-job-65ed6c1f-e74e-47ed-a85f-126ef1071a47").click(); - cy.get("#remove-job-285aa472-990f-418d-b376-e03c27f48d17").click(); + cy.get("#remove-job-7").click(); + cy.get("#remove-job-4").click(); + cy.get("#remove-job-1").click(); + cy.get("#remove-job-8").click(); + cy.get("#remove-job-9").click(); cy.get("[data-cy=pagination-list] > :nth-child(3) > button").click(); - cy.get("#remove-job-11cbce13-e6cd-4c79-b904-d292b569b22f").click(); + cy.get("#remove-job-2").click(); }); }); context("Saved Jobs - No Results", () => { beforeEach(() => { - cy.fixture("jobs50").then((jobsJson) => { - cy.server(); - cy.route({ - method: "POST", - url: "/jobs", - status: 200, - response: jobsJson, - delay: 1000, - }); - }); cy.visit("http://localhost:3000"); cy.wait(500); cy.get("#nav-login").click(); diff --git a/cypress/integration/search.spec.js b/cypress/integration/search.spec.js index 4ebeb7e..4b6a5ed 100644 --- a/cypress/integration/search.spec.js +++ b/cypress/integration/search.spec.js @@ -2,24 +2,15 @@ context("Search", () => { beforeEach(() => { - cy.fixture("jobs50").then((jobsJson) => { - cy.fixture("jobsSearch1").then((searchJson) => { - cy.server(); - cy.route({ - method: "POST", - url: "/jobs", - status: 200, - response: jobsJson, - delay: 1000, - }); - cy.route({ - method: "GET", - url: - "/jobs/search?userId=&full_time=false&contract=false&description=developer", - status: 200, - response: searchJson, - delay: 1000, - }); + cy.fixture("jobsSearch1").then((searchJson) => { + cy.server(); + cy.route({ + method: "GET", + url: + "/jobs/search?userId=&full_time=false&contract=false&description=developer", + status: 200, + response: searchJson, + delay: 1000, }); }); cy.visit("http://localhost:3000"); diff --git a/cypress/integration/signup.spec.js b/cypress/integration/signup.spec.js index 0d7e931..067af26 100644 --- a/cypress/integration/signup.spec.js +++ b/cypress/integration/signup.spec.js @@ -2,25 +2,6 @@ context("Signup - Success", () => { beforeEach(() => { - cy.fixture("jobs50").then((jobsJson) => { - cy.fixture("signup").then((signupJson) => { - cy.server(); - cy.route({ - method: "POST", - url: "/jobs", - status: 200, - response: jobsJson, - delay: 1000, - }); - cy.route({ - method: "POST", - url: "/user", - status: 200, - response: signupJson, - delay: 1000, - }); - }); - }); cy.visit("http://localhost:3000"); cy.wait(500); cy.get("#nav-login").click(); @@ -31,8 +12,8 @@ context("Signup - Success", () => { }); it("Should be able to sign up a new account", () => { - cy.get("#name").type("Bob Test"); - cy.get("#email").type("bobtest@email.com"); + cy.get("#name").type("Bob Test 2"); + cy.get("#email").type("bobtest2@email.com"); cy.get("#password").type("Red123456!!!"); cy.get("#confirm-password").type("Red123456!!!"); cy.get("#signup").click(); @@ -40,6 +21,12 @@ context("Signup - Success", () => { cy.get("#nav-login").should("not.exist"); cy.get("#search").should("be.visible"); + + // * Cleanup + cy.get("#nav-profile").click(); + cy.get("#settings").click(); + cy.get("#delete-profile").click(); + cy.get("#delete-profile-confirm").click(); }); it("Should be able to get to Login from Signup page", () => { @@ -50,16 +37,6 @@ context("Signup - Success", () => { context("Signup - Error", () => { beforeEach(() => { - cy.fixture("jobs50").then((jobsJson) => { - cy.server(); - cy.route({ - method: "POST", - url: "/jobs", - status: 200, - response: jobsJson, - delay: 1000, - }); - }); cy.visit("http://localhost:3000"); cy.wait(500); cy.get("#nav-login").click(); From c0e65cf5bc8bb67be483619a807da5aee5b774d8 Mon Sep 17 00:00:00 2001 From: alexlee-dev Date: Fri, 21 Aug 2020 16:46:16 -0700 Subject: [PATCH 09/17] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=94=AC=20Creat?= =?UTF-8?q?e=20Test=20Database=20#91=20-=20Fix=20'how=5Fto=5Fapply'=20db?= =?UTF-8?q?=20jobs=20field?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/controllers/testDB.ts | 35 +++++++++++++++++++++++++++++++- src/server/util.ts | 2 +- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/server/controllers/testDB.ts b/src/server/controllers/testDB.ts index 7114252..91ae4ba 100644 --- a/src/server/controllers/testDB.ts +++ b/src/server/controllers/testDB.ts @@ -2,7 +2,7 @@ import express, { Request, Response, Router } from "express"; import JobModel from "../models/Job"; -import { ErrorResponse, Job } from "../types"; +import { ErrorResponse, Job, JobDocument } from "../types"; import { generateFakeJob } from "../util"; /** @@ -52,6 +52,39 @@ class TestDBController { } } ); + + this.router.get( + "/fix-how-to-apply", + async ( + req: Request, + res: Response + ): Promise> => { + if (process.env.NODE_ENV !== "test") { + return res.status(500).send({ error: "Invalid environment." }); + } + + try { + // * Get each job in DB + const jobs: JobDocument[] = await JobModel.find({}); + + // * Modify `how_to_apply` field of each job + await Promise.all( + jobs.map(async (job: JobDocument) => { + const dbJob = await JobModel.find({ id: job.id }); + dbJob[0].how_to_apply = + '

'; + await dbJob[0].save(); + return; + }) + ); + + return res.send(); + } catch (error) { + console.error(error); + res.status(500).send({ error }); + } + } + ); } } diff --git a/src/server/util.ts b/src/server/util.ts index 36fb018..39c1c5d 100644 --- a/src/server/util.ts +++ b/src/server/util.ts @@ -247,7 +247,7 @@ export const generateFakeJob = (index: number): Job => { company_url: "https://www.google.com/", description: "

On the other hand, we denounce with righteous indignation and dislike men who are so beguiled and demoralized by the charms of pleasure of the moment, so blinded by desire, that they cannot foresee the pain and trouble that are bound to ensue; and equal blame belongs to those who fail in their duty through weakness of will, which is the same as saying through shrinking from toil and pain. These cases are perfectly simple and easy to distinguish. In a free hour, when our power of choice is untrammelled and when nothing prevents our being able to do what we like best, every pleasure is to be welcomed and every pain avoided. But in certain circumstances and owing to the claims of duty or the obligations of business it will frequently occur that pleasures have to be repudiated and annoyances accepted. The wise man therefore always holds in these matters to this principle of selection: he rejects pleasures to secure other greater pleasures, or else he endures pains to avoid worse pains.

\n", - how_to_apply: '', + how_to_apply: '

', id: index.toString(), listingDate: "Thu Jul 4 12:00:00 UTC 1776", location: randomItem(locations), From bdd1a4046083d8f8431bd0ad5d68ab8eae432091 Mon Sep 17 00:00:00 2001 From: alexlee-dev Date: Fri, 21 Aug 2020 19:26:41 -0700 Subject: [PATCH 10/17] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=94=AC=20Creat?= =?UTF-8?q?e=20Test=20Database=20#91=20-=20Adjust=20Skipped=20Tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cypress/integration/hiddenJobs.spec.js | 75 ++++++++++++-------------- cypress/integration/search.spec.js | 27 +++++++--- 2 files changed, 53 insertions(+), 49 deletions(-) diff --git a/cypress/integration/hiddenJobs.spec.js b/cypress/integration/hiddenJobs.spec.js index 00b9c72..923132d 100644 --- a/cypress/integration/hiddenJobs.spec.js +++ b/cypress/integration/hiddenJobs.spec.js @@ -84,17 +84,14 @@ context("Hidden Jobs", () => { cy.get("#show-job-7").click(); }); - // ! Unable to do with current implementation - // * If you don't stub it, the real db may not contain that job listing anymore - // * If you do stub it, you can't conditionally send a smaller list of jobs each time it hits /user/hiddenJobDetails - it.skip("Should display currentPage as '1' when viewing hiddenJobs", () => { + it("Should display currentPage as '1' when viewing hiddenJobs", () => { // * Hide 6 jobs cy.get("#hide-job-7").click(); cy.get("#hide-job-4").click(); cy.get("#hide-job-1").click(); - cy.get("#hide-job-65ed6c1f-e74e-47ed-a85f-126ef1071a47").click(); - cy.get("#hide-job-285aa472-990f-418d-b376-e03c27f48d17").click(); - cy.get("#hide-job-11cbce13-e6cd-4c79-b904-d292b569b22f").click(); + cy.get("#hide-job-8").click(); + cy.get("#hide-job-9").click(); + cy.get("#hide-job-2").click(); // * View Hidden Jobs cy.get("#nav-profile").click(); @@ -112,9 +109,9 @@ context("Hidden Jobs", () => { cy.get("#show-job-7").click(); cy.get("#show-job-4").click(); cy.get("#show-job-1").click(); - cy.get("#show-job-65ed6c1f-e74e-47ed-a85f-126ef1071a47").click(); - cy.get("#show-job-285aa472-990f-418d-b376-e03c27f48d17").click(); - cy.get("#show-job-11cbce13-e6cd-4c79-b904-d292b569b22f").click(); + cy.get("#show-job-8").click(); + cy.get("#show-job-9").click(); + cy.get("#show-job-2").click(); }); it("Should hide the job from the list of current jobs when user hides job", () => { @@ -132,17 +129,14 @@ context("Hidden Jobs", () => { cy.get("#notification > button").click(); }); - // ! Unable to do with current implementation - // * If you don't stub it, the real db may not contain that job listing anymore - // * If you do stub it, you can't conditionally send a smaller list of jobs each time it hits /user/hiddenJobDetails - it.skip("Should display pagination correctly", () => { + it("Should display pagination correctly", () => { // * Hide 6 jobs cy.get("#hide-job-7").click(); cy.get("#hide-job-4").click(); cy.get("#hide-job-1").click(); - cy.get("#hide-job-65ed6c1f-e74e-47ed-a85f-126ef1071a47").click(); - cy.get("#hide-job-285aa472-990f-418d-b376-e03c27f48d17").click(); - cy.get("#hide-job-11cbce13-e6cd-4c79-b904-d292b569b22f").click(); + cy.get("#hide-job-8").click(); + cy.get("#hide-job-9").click(); + cy.get("#hide-job-2").click(); // * View Hidden Jobs cy.get("#nav-profile").click(); @@ -171,9 +165,9 @@ context("Hidden Jobs", () => { // * Cleanup cy.get("#show-job-4").click(); cy.get("#show-job-1").click(); - cy.get("#show-job-65ed6c1f-e74e-47ed-a85f-126ef1071a47").click(); - cy.get("#show-job-285aa472-990f-418d-b376-e03c27f48d17").click(); - cy.get("#show-job-11cbce13-e6cd-4c79-b904-d292b569b22f").click(); + cy.get("#show-job-8").click(); + cy.get("#show-job-9").click(); + cy.get("#show-job-2").click(); }); it("Should not display hidden jobs when page reloads", () => { @@ -186,12 +180,8 @@ context("Hidden Jobs", () => { // * Hidden Jobs should not display cy.get("#show-job-7").should("not.exist"); - cy.get("#show-job-4").should( - "not.exist" - ); - cy.get("#show-job-1").should( - "not.exist" - ); + cy.get("#show-job-4").should("not.exist"); + cy.get("#show-job-1").should("not.exist"); // * Cleanup cy.get("#nav-profile").click(); @@ -201,10 +191,7 @@ context("Hidden Jobs", () => { cy.get("#show-job-1").click(); }); - // ! Unable to do with current implementation - // * If you don't stub it, the real db may not contain that job listing anymore - // * If you do stub it, you can't conditionally send a smaller list of jobs each time it hits /user/hiddenJobDetails - it.skip("Should not display hidden jobs in currentJobs", () => { + it("Should not display hidden jobs in currentJobs", () => { // * Hide a job cy.get("#hide-job-7").click(); // * Log User out @@ -222,10 +209,14 @@ context("Hidden Jobs", () => { cy.wait(500); cy.get("#\\37").should("not.exist"); + + // * Cleanup + cy.get("#nav-profile").click(); + cy.get("#view-hidden-jobs").click(); + cy.get("#show-job-7").click(); }); - // ! Can't do this until you create a Test Database - it.skip("Should reset currentPage if hiding the last job on the last page", () => { + it("Should reset currentPage if hiding the last job on the last page", () => { // * Go to last page cy.get(":nth-child(6) > button").click(); @@ -233,11 +224,11 @@ context("Hidden Jobs", () => { cy.get("[data-cy=pagination-item-selected]").should("have.text", "10"); // * Hide 5 jobs - cy.get("#hide-job-69f7a578-6a8b-4df4-8088-fb8d94d33060").click(); - cy.get("#hide-job-3076f2fe-b421-4b0d-8876-b20c02322ba7").click(); - cy.get("#hide-job-c019304d-2472-4934-89e2-5e0a33d40226").click(); - cy.get("#hide-job-35bca1a2-42d3-4f6c-93ab-efb76dbfaead").click(); - cy.get("#hide-job-988bf054-4955-4859-a642-062def8017cb").click(); + cy.get("#hide-job-45").click(); + cy.get("#hide-job-46").click(); + cy.get("#hide-job-47").click(); + cy.get("#hide-job-48").click(); + cy.get("#hide-job-49").click(); // * Assert current page is now "9" cy.get("[data-cy=pagination-item-selected]").should("have.text", "9"); @@ -245,11 +236,11 @@ context("Hidden Jobs", () => { // * Cleanup cy.get("#nav-profile").click(); cy.get("#view-hidden-jobs").click(); - cy.get("#show-job-69f7a578-6a8b-4df4-8088-fb8d94d33060").click(); - cy.get("#show-job-3076f2fe-b421-4b0d-8876-b20c02322ba7").click(); - cy.get("#show-job-c019304d-2472-4934-89e2-5e0a33d40226").click(); - cy.get("#show-job-35bca1a2-42d3-4f6c-93ab-efb76dbfaead").click(); - cy.get("#show-job-988bf054-4955-4859-a642-062def8017cb").click(); + cy.get("#show-job-45").click(); + cy.get("#show-job-46").click(); + cy.get("#show-job-47").click(); + cy.get("#show-job-48").click(); + cy.get("#show-job-49").click(); }); }); diff --git a/cypress/integration/search.spec.js b/cypress/integration/search.spec.js index 4b6a5ed..485889b 100644 --- a/cypress/integration/search.spec.js +++ b/cypress/integration/search.spec.js @@ -43,18 +43,22 @@ context("Search", () => { cy.get('[data-cy="orbit-container"]').should("be.visible"); }); - // ! Unable to do with current implementation - // * If you don't stub it, the real db may not contain that job listing anymore - // * If you do stub it, you can't conditionally send a smaller list of jobs each time it hits /user/hiddenJobDetails - it.skip("Should not display hidden jobs in currentJobs on search", () => { + it("Should not display hidden jobs in currentJobs on search", () => { + // * Log In + cy.get("#nav-login").click(); + cy.get("#email").type("bobtest@email.com"); + cy.get("#password").type("Red123456!!!"); + cy.get("#log-in").click(); + cy.wait(500); + // * Hide a job - cy.get("#hide-job-f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").click(); + cy.get("#hide-job-7").click(); // * Log User out cy.get("#nav-profile").click(); cy.get("#settings").click(); cy.get("#log-out").click(); - cy.get("#f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").should("exist"); + cy.get("#\\37").should("exist"); // * Log In cy.get("#nav-login").click(); @@ -63,9 +67,18 @@ context("Search", () => { cy.get("#log-in").click(); cy.wait(500); - cy.get("#f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").should("not.exist"); + cy.get("#\\37").should("not.exist"); // * Do search + cy.get("#search-submit").click(); + + // * Assert job does not exist + cy.get("#\\37").should("not.exist"); + + // * Cleanup + cy.get("#nav-profile").click(); + cy.get("#view-hidden-jobs").click(); + cy.get("#show-job-7").click(); }); it("Should reset search values on reload", () => { From 63775713a19ef8a6cf09dab3dcf615da7f33ba25 Mon Sep 17 00:00:00 2001 From: alexlee-dev Date: Sat, 22 Aug 2020 16:53:12 -0700 Subject: [PATCH 11/17] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=94=AC=20Creat?= =?UTF-8?q?e=20Test=20Database=20#91=20-=20Fix=20Testing=20Issues?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cypress/fixtures/hiddenDetails.json | 80 ------------- cypress/fixtures/jobDetails.json | 13 --- cypress/fixtures/jobsSearch1.json | 93 ---------------- cypress/fixtures/jobsSearch2.json | 54 --------- cypress/fixtures/jobsSearch3.json | 41 ------- cypress/fixtures/login.json | 8 -- cypress/fixtures/savedDetails.json | 80 ------------- cypress/fixtures/signup.json | 8 -- cypress/integration/applicationError.spec.js | 6 - cypress/integration/authentication.spec.js | 111 +++++++++---------- cypress/integration/details.spec.js | 1 - cypress/integration/directPageAccess.spec.js | 6 - cypress/integration/hiddenJobs.spec.js | 15 --- cypress/integration/login.spec.js | 5 - cypress/integration/notification.spec.js | 9 -- cypress/integration/optionsPanel.spec.js | 7 -- cypress/integration/pagination.spec.js | 8 +- cypress/integration/profile.spec.js | 16 --- cypress/integration/savedJobs.spec.js | 4 - cypress/integration/search.spec.js | 28 ++--- cypress/integration/signup.spec.js | 4 - src/server/controllers/job.ts | 2 +- 22 files changed, 67 insertions(+), 532 deletions(-) delete mode 100644 cypress/fixtures/hiddenDetails.json delete mode 100644 cypress/fixtures/jobDetails.json delete mode 100644 cypress/fixtures/jobsSearch1.json delete mode 100644 cypress/fixtures/jobsSearch2.json delete mode 100644 cypress/fixtures/jobsSearch3.json delete mode 100644 cypress/fixtures/login.json delete mode 100644 cypress/fixtures/savedDetails.json delete mode 100644 cypress/fixtures/signup.json diff --git a/cypress/fixtures/hiddenDetails.json b/cypress/fixtures/hiddenDetails.json deleted file mode 100644 index 770df96..0000000 --- a/cypress/fixtures/hiddenDetails.json +++ /dev/null @@ -1,80 +0,0 @@ -[ - { - "id": "f1884b46-ecb4-473c-81f5-08d9bf2ab3bb", - "type": "Full Time", - "url": "https://jobs.github.com/positions/f1884b46-ecb4-473c-81f5-08d9bf2ab3bb", - "listingDate": "Thu Jul 16 12:03:19 UTC 2020", - "company": "Cool Company", - "company_url": "https://www.adswizz.com/", - "location": "Bucharest", - "title": "Cloud DevOps Engineer", - "description": "\u003cp\u003eFor our Global Operations team in Bucharest, located at the 35th floor in Sky Tower building (highest in Romania), we are hiring a Cloud DevOps Engineer.\u003c/p\u003e\n\u003cp\u003eAs a Cloud DevOps Engineer you will:\n– Be curious. You ask \"why\"?, you explore, you’re not afraid to blurt out your crazy idea\n– Code the infrastructure to act as designed\n– Improve the whole life-cycle of services from design, through deployment, operation and refinement\n– Maintain services once they are live by measuring and monitoring availability, latency and overall system health\n– Scale systems sustainably through mechanisms like automation, and evolve systems by pushing for changes that improve reliability and velocity\n– Practice sustainable incident response and blameless postmortems\n– Have an opinion on any/all of the following orchestration tools\n– Be an audiophile – Interested in all things audio including but not limited to: sound quality, streaming technologies and best bands of 21st century\u003c/p\u003e\n\u003cp\u003eWhat you bring to the team:\n– Bachelor Degree in Computer Science, Mathematics and Informatics or equivalent\n– At least 2 years of experience working on large-scale distributed systems\n– Experience running Linux-based production systems\n– Your thinking starts with the desire for high availability\n– Your love for the command line and scripting development\n– Experience with Amazon AWS services (EC2, S3, ELB, …)\n– Experience with or related technologies like Puppet, Ansible, Nagios, Grafana, Prometheus, HAProxy, NGinx, Apache, MySQL/MariaDB, Kubernetes, Kafka, Hadoop\n– CI/CD for both infrastructure and applications\u003c/p\u003e\n\u003cp\u003eOur offer (bonuses, benefits) – what’s in it for you:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCasual \u0026amp; friendly working environment with opportunities to impact the company with your ideas and involvement\u003c/li\u003e\n\u003cli\u003eWe have a start-up culture, product-centric, international/multi-cultural environment in each office and easy going communication style (even with Top Management)\u003c/li\u003e\n\u003cli\u003eTechnology diversity, interesting technical exposure in building the best ad-tech product on the market\u003c/li\u003e\n\u003cli\u003eFlexible working schedule and work-from-home option, within predefined rules\u003c/li\u003e\n\u003cli\u003eIndividual training budget to use as you like for career improvement\u003c/li\u003e\n\u003cli\u003eBonus system, on top of base salary, paid quarterly (for real, not just on paper)\u003c/li\u003e\n\u003cli\u003ePaid days off related to quarterly performance\u003c/li\u003e\n\u003cli\u003eDay off on your birthday (or within that month if it falls on the weekend)\u003c/li\u003e\n\u003cli\u003eSports bonus for activities such as gym, dances, yoga, etc.\u003c/li\u003e\n\u003cli\u003eWe encourage your healthy life-style with company paid enrollment for running or biking events\u003c/li\u003e\n\u003cli\u003eMeal tickets\u003c/li\u003e\n\u003cli\u003eGift cards for special events (e.g.: Easter, 1st of June, 8th of March, Christmas)\u003c/li\u003e\n\u003cli\u003eMedical coverage to keep you healthy\u003c/li\u003e\n\u003cli\u003eParking lots at Sky Tower\u003c/li\u003e\n\u003cli\u003eAdsWizz technical books library – you can propose new technical books to be bought by the company\u003c/li\u003e\n\u003cli\u003eBookster subscription\u003c/li\u003e\n\u003cli\u003eGood hardware devices (new laptops / Mac’s, displays etc.)\u003c/li\u003e\n\u003cli\u003eOffice relaxation areas (ping-pong, foosball etc.)\u003c/li\u003e\n\u003cli\u003eTeam buildings – each team goes on outings to keep that flame alive\u003c/li\u003e\n\u003cli\u003eAnnual Christmas party – the best company party you’ve ever seen\u003c/li\u003e\n\u003cli\u003eFamily events (e.g.: Halloween and Christmas party for employees’ kids)\u003c/li\u003e\n\u003cli\u003eThemed team events nights (casino night, boardgames night, scary movies night, etc.)\u003c/li\u003e\n\u003cli\u003eCatered lunch-time meetings\u003c/li\u003e\n\u003cli\u003eWe have weekly fresh fruit along with coffee and tea to keep that brain in top shape, orange juice \u0026amp; vending machine on premise as well\u003c/li\u003e\n\u003cli\u003eCSR activities (cake auctions, yard sales, blood donation campaigns at our office)\nWanna see how Belgian chocolate goes with technology? Come and join a community of the smartest folks you’ve ever met, that want to aim for the sky and want to use their skills to make a difference!\u003c/li\u003e\n\u003c/ul\u003e\n", - "how_to_apply": "\u003cp\u003e\u003ca href=\"https://www.adswizz.com/our-careers#!/job/4528257002?utm_source=github\u0026amp;utm_medium=smartdreamers\u0026amp;utm_campaign=July_2020_%7C_Cloud_DevOps_Engineer_%7C_Bucharest\"\u003ehttps://www.adswizz.com/our-careers#!/job/4528257002?utm_source=github\u0026amp;utm_medium=smartdreamers\u0026amp;utm_campaign=July_2020_%7C_Cloud_DevOps_Engineer_%7C_Bucharest\u003c/a\u003e\u003c/p\u003e\n", - "company_logo": "https://jobs.github.com/rails/active_storage/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBanFHIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--0903e54cc814013e7ce5b39a629717629e033a4e/Adswizz.png" - }, - { - "id": "72de09f2-5bc6-489f-be90-3d38e505e20a", - "type": "Full Time", - "url": "https://jobs.github.com/positions/72de09f2-5bc6-489f-be90-3d38e505e20a", - "listingDate": "Thu Jul 16 12:01:05 UTC 2020", - "company": "Cool Company", - "company_url": "https://www.adswizz.com/", - "location": "Bucharest", - "title": "Full Stack Developer", - "description": "\u003cp\u003eFor our Internal Apps team in Bucharest, located in Sky Tower building (highest high in Romania), we are hiring a Full-stack Developer, with strong, proven JavaScript skills for building solid UIs. The team supports several services that help AdsWizz operate better regarding the finance team, billing users, and data center operations. In order to support all of these different areas, we need to work closely with our colleagues and partners, building products that allow these different teams to move fast.\nAt AdsWizz, our software suite includes a variety of ad technology capabilities, including dynamic ad insertion, advanced programmatic platforms, ad campaign monitoring tools, and more.\u003c/p\u003e\n\u003cp\u003eAs a Full Stack Developer, you will:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eWork with a new team developing internal applications to support enterprise operations\u003c/li\u003e\n\u003cli\u003ePlay a role in re-imagining productivity by shipping products that serve different aspects within AdsWizz\u003c/li\u003e\n\u003cli\u003eContinual improvement of tech stack and processes\u003c/li\u003e\n\u003cli\u003eIdentify and fix any performance issues\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eYour Job Requirements:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eBachelor Degree in Computer Science, Mathematics and Informatics or equivalent\u003c/li\u003e\n\u003cli\u003eOverall knowledge of the Java ecosystem\u003c/li\u003e\n\u003cli\u003eHands-on experience using Spring Boot\u003c/li\u003e\n\u003cli\u003eExposure to MongoDB preferred\u003c/li\u003e\n\u003cli\u003eCloud experience with AWS preferred\u003c/li\u003e\n\u003cli\u003eMinimum of 2 years in Frontend Development\u003c/li\u003e\n\u003cli\u003eExperience with at least one modern JS framework (Vue, React, Angular)\u003c/li\u003e\n\u003cli\u003eExperience with HTML5, CSS and JavaScript\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eOur offer (bonuses, benefits) - what’s in it for you:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCasual \u0026amp; friendly working environment with opportunities to impact the company with your ideas and involvement\u003c/li\u003e\n\u003cli\u003eWe have a start-up culture, product-centric, international/multi-cultural environment in each office and easy-going communication style (even with Top Management)\u003c/li\u003e\n\u003cli\u003eTechnology diversity, interesting technical exposure in building the best ad-tech product on the market\u003c/li\u003e\n\u003cli\u003eFlexible working schedule and work-from-home option, within predefined rules\u003c/li\u003e\n\u003cli\u003eIndividual trainings budget to use as you like for career improvement\u003c/li\u003e\n\u003cli\u003eBonus system, on top of base salary, paid quarterly (for real, not just on paper)\u003c/li\u003e\n\u003cli\u003ePaid days off related to quarterly performance\u003c/li\u003e\n\u003cli\u003eDay off on your birthday (or within that month if it falls on the weekend)\u003c/li\u003e\n\u003cli\u003eSports bonus for activities such as gym, dances, yoga, etc.\u003c/li\u003e\n\u003cli\u003eWe encourage your healthy lifestyle with company paid enrollment for running or biking events\u003c/li\u003e\n\u003cli\u003eMeal tickets\u003c/li\u003e\n\u003cli\u003eGift cards for special events (e.g.: Easter, 1st of June, 8th of March, Christmas)\u003c/li\u003e\n\u003cli\u003eMedical coverage to keep you healthy\u003c/li\u003e\n\u003cli\u003eParking lots at Sky Tower\u003c/li\u003e\n\u003cli\u003eAdsWizz technical books library – you can propose new technical books to be bought by the company\u003c/li\u003e\n\u003cli\u003eBookster subscription\u003c/li\u003e\n\u003cli\u003eGood hardware devices (new laptops / Mac’s, displays etc.)\u003c/li\u003e\n\u003cli\u003eOffice relaxation areas (ping-pong, foosball etc.)\u003c/li\u003e\n\u003cli\u003eTeam buildings – each team goes on outings to keep that flame alive\u003c/li\u003e\n\u003cli\u003eAnnual Christmas party – the best company party you’ve ever seen\u003c/li\u003e\n\u003cli\u003eFamily events (e.g.: Halloween and Christmas party for employees’ kids)\u003c/li\u003e\n\u003cli\u003eThemed team events nights (casino night, boardgames night, scary movies night, etc.)\u003c/li\u003e\n\u003cli\u003eCatered lunch-time meetings\u003c/li\u003e\n\u003cli\u003eWe have weekly fresh fruit along with coffee and tea to keep that brain in top shape, orange juice \u0026amp; vending machine on premise as well\u003c/li\u003e\n\u003cli\u003eCSR activities (cake auctions, yard sales, blood donation campaigns at our office)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eWanna see how Belgian chocolate goes with technology? Come and join a community of the smartest folks you’ve ever met, that want to aim for the sky and want to use their skills to make a difference!\u003c/p\u003e\n", - "how_to_apply": "\u003cp\u003e\u003ca href=\"https://www.adswizz.com/our-careers#!/job/4655034002?utm_source=github\u0026amp;utm_medium=smartdreamers\u0026amp;utm_campaign=July_2020_%7C_Tech_-_Carusel_%20_Reddit_V2\"\u003ehttps://www.adswizz.com/our-careers#!/job/4655034002?utm_source=github\u0026amp;utm_medium=smartdreamers\u0026amp;utm_campaign=July_2020_%7C_Tech_-_Carusel_%20_Reddit_V2\u003c/a\u003e\u003c/p\u003e\n", - "company_logo": "https://jobs.github.com/rails/active_storage/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBamlHIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--e1179a81b464c0745dbc8425721bc2fd18c91588/Adswizz.png" - }, - { - "id": "cc20d9f2-0102-4785-8253-66093d3ca5c0", - "type": "Full Time", - "url": "https://jobs.github.com/positions/cc20d9f2-0102-4785-8253-66093d3ca5c0", - "listingDate": "Thu Jul 16 02:02:01 UTC 2020", - "company": "Koffie Labs", - "company_url": "https://www.getkoffie.com/", - "location": "NYC/Remote", - "title": "Junior Data Engineer", - "description": "\u003cp\u003eKoffie is an insurance company purpose built for the autonomous vehicle era. We are taking transportation insurance out of the dark ages by using modern technology to deliver instant policies based on advanced safety and autonomous technology. As an InsurTech, Koffie is free from legacy systems and inefficient processes, our AI-driven predictive models deliver a reimagined insurance experience for fleets.\u003c/p\u003e\n\u003cp\u003eWe believe strongly in diversity of thought which comes from different backgrounds and experiences and want to hear from you, regardless of where you live. Koffie is a work from home first company but believes face time every few weeks is essential.\u003c/p\u003e\n\u003cp\u003eOur vision is to align incentives across fleets, technology providers, brokers and the automotive industry. By catalyzing the adoption of safety technology, we positively impact road safety and facilitate a more efficient supply chain. We’re backed by top-tier VCs in the fintech and mobility sectors. If you're ready to work obsessively with us to make insurance better, faster, more efficient and build products for the next 100 years of mobility, we want to hear from you.\u003c/p\u003e\n\u003cp\u003eDescription\nThis is a unique role that offers broad exposure to software engineering and data science. We are eager to find underrepresented candidates who are early in their career and don’t want to choose between engineering or data science.\u003c/p\u003e\n\u003cp\u003eWorking with data science and engineering, you will be deeply enmeshed in the critical nuances of disambiguation, normalization, standardization and other ETL skills. You will also have the opportunity to work in all stages of our software process from researching data sources to developing data pipelines and building business intelligence visualization tools.\u003c/p\u003e\n\u003cp\u003eResponsibilities\u003c/p\u003e\n\u003cp\u003eDesign and build data pipelines\nRun and iterate data science experiments in the cloud and in a production environment\nSupport business intelligence and data science needs via visualization/reporting\u003c/p\u003e\n\u003cp\u003eBackground/Experience\u003c/p\u003e\n\u003cp\u003e-Undergraduate CS degree or equivalent; 2-5 years professional experience\n-Experience with python; the ideal candidate is generally comfortable with web programming, consuming APIs, data wrangling, etc.\n-ETL processes on large open/public (\u0026gt;50 GB) datasets a plus\n-Designing systems that store/query geospatial and time series data\n-Familiarity with python data engineering, data science, and visualization frameworks\n-Good understanding of classification and regression metrics\n-Curiosity for insurance and autonomous technology applied to transportation/trucking\n-Entrepreneurial mindset and comfort with ambiguity\u003c/p\u003e\n\u003cp\u003eBenefits\nFor US employees we offer a competitive salary, stock options, unlimited vacation, 100% employer paid health, vision and dental plans, commuter benefits and discounted fitness classes, generous WFH stipend, personal learning/training (for professional/industry certification) and conference budget. For remote hires outside the US, we are unable to provide employer paid health, vision and dental plans, commuter benefits and discounted fitness classes.\u003c/p\u003e\n\u003cp\u003eWe believe strongly in diversity of thought which comes from different backgrounds and experiences. Covid has helped us transform to a WFH-first company, so periodic multi-day get-togethers are an essential part of growing our team.\u003c/p\u003e\n", - "how_to_apply": "\u003cp\u003e\u003ca href=\"https://apply.workable.com/j/A4566CE638\"\u003ehttps://apply.workable.com/j/A4566CE638\u003c/a\u003e\u003c/p\u003e\n", - "company_logo": "https://jobs.github.com/rails/active_storage/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBaVdHIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--e4bccde8a00566a0961a533bbed67c6026714783/koffie%20logo%20black.jpg" - }, - { - "id": "65ed6c1f-e74e-47ed-a85f-126ef1071a47", - "type": "Full Time", - "url": "https://jobs.github.com/positions/65ed6c1f-e74e-47ed-a85f-126ef1071a47", - "listingDate": "Wed Jul 15 14:35:57 UTC 2020", - "company": "Avans Hogeschool", - "company_url": "http://www.avans.nl", - "location": "Breda", - "title": "Product owner", - "description": "\u003cp\u003eBreda 0,8 - 1,0 fte\u003c/p\u003e\n\u003cp\u003eMet een slim begrotings- en prognoseproces Avans in staat stellen om betere bedrijfsmatige keuzes te maken. Dat is jouw eerste uitdaging. Het budget zo goed mogelijk inzetten voor het beste onderwijs.\u003c/p\u003e\n\u003ch2\u003e\u003cstrong\u003eUitdagend werk\u003c/strong\u003e\u003c/h2\u003e\n\u003cp\u003eWe hebben al heel wat vooronderzoek gedaan. Zo hebben we al een goed systeem om terug te kijken naar onze financiële prestaties in het verleden. Als Product Owner ga jij ons helpen om naar de toekomst te kijken. Met de aankoop, implementatie en (door)ontwikkeling van een state of the art begrotings- en prognosesysteem. Vanuit integraliteit werk je intensief samen met andere collega’s van HR en Management informatie. Voor jou een aantrekkelijke combinatie. Want jij hebt ervaring met het kernonderwerp Finance en je weet wensen van stakeholders te vertalen naar op te leveren verbeterde en gedigitaliseerde bedrijfsvoeringsprocessen. Dat doe je door:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eEen strategische start: je verzamelt ideeën en zet de koers uit binnen een zelfsturend team dat volgens een agile methode samenwerkt. Je gaat nadenken over de inhoud. Wat willen we bereiken en hoe gaan we de prognose tool gebruiken? Je gaat nadenken over het verleden en dit projecteren op de toekomst. We zijn benieuwd naar jouw ideeën.\u003c/li\u003e\n\u003cli\u003eVerbinding: je brengt partijen bij elkaar en weet te overtuigen. Dit doe je in nauwe samenwerking met andere Product Owners, de Programma Manager, betrokken stakeholders (gebruikers van het systeem zoals professionals en directieleden), de scrummaster en specialisten, bijvoorbeeld de technisch specialisten die in het digitale systeem realiseren wat jij met je team hebt bedacht.\u003c/li\u003e\n\u003cli\u003eEen wow effect te creëren bij je stakeholders: in de rol van Product Owner ga je waarde toevoegen omdat jij enerzijds een gedegen bedrijfseconomische achtergrond hebt, maar ook omdat je een commerciële instelling hebt en het oprecht leuk vindt om mensen te verbinden. Je gaat met hen aan tafel en maakt ze enthousiast.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e\u003cstrong\u003eJuiste match\u003c/strong\u003e\u003c/h2\u003e\n\u003cp\u003eJe bent een resultaatgerichte en verbindende Product Owner die goed kan luisteren, analyseren en verkopen. Samen met je stakeholders en Scrum Team ga je voor succes. Door je prettige manier van communiceren zorg je voor transparantie en duidelijkheid van de product backlog en de product roadmap. En dan heb je ook nog:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eEen hbo-diploma, bijvoorbeeld in de richting van economie of IT. Richting is niet het belangrijkste, je hebt in ieder geval een sterke affiniteit met Finance, ICT en innovatie.\u003c/li\u003e\n\u003cli\u003eMinimaal 5 jaar relevante ervaring als bijvoorbeeld Product Owner, Project Manager of Consultant. Door je ervaring weet je een product vision board en roadmap te creëren en weet je hoe je de voortgang bewaakt van backlog items en opleverdata.\u003c/li\u003e\n\u003cli\u003eCommercieel gevoel, waardoor je tijdens implementatie kan zorgen voor draagvlak en je hand niet omdraait voor het verzorgen van specifieke trainingen. Ook kan je goed omgaan met andere meningen van belangrijke stakeholders.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e\u003cstrong\u003eInspirerende omgeving\u003c/strong\u003e\u003c/h2\u003e\n\u003cp\u003eAvans Hogeschool heeft 53 hbo-opleidingen, 31.000 studenten en 2.800 medewerkers. Behoort al jarenlang tot de top 3 van hogescholen van Nederland. En heeft locaties in Breda, ’s-Hertogenbosch, Roosendaal en Tilburg. We leggen de lat hoog. Ook voor onszelf. Je komt terecht in een warme organisatie met oog voor jou als persoon en jouw ontwikkelwensen. In een informele sfeer delen we best practices met elkaar. Je werk is afwisselend, je hebt mogelijkheden om jezelf verder te ontwikkelen en vanuit deze rol verder door te groeien. Jouw directe collega’s werken bij de Diensteenheid Financiën en Studentenadministratie (DFS) van Avans Hogeschool. Zij heten je graag welkom. Alle 70 medewerkers van DFS streven naar herkenbare kwaliteit in alle processen via een continue verbeterdrang. Zo draagt het team bij aan de ambitie van Avans. Onze kernwaarden zijn: ondernemend, respect, transparant en samen.\u003c/p\u003e\n\u003ch2\u003e\u003cstrong\u003eGoede werkgever\u003c/strong\u003e\u003c/h2\u003e\n\u003cp\u003eAvans Hogeschool haalt graag het allerbeste uit mensen. We staan bekend als goede werkgever. Dat zie je terug in onze arbeidsvoorwaarden.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eVeel vrijheid in je baan met de mogelijkheid om vanuit huis te werken.\u003c/li\u003e\n\u003cli\u003eJe ontvangt een maandsalaris in schaal 11: minimaal € 3.658,64 en maximaal € 5.026,85 bruto bij een fulltime aanstelling. Dit is conform cao hbo.\u003c/li\u003e\n\u003cli\u003eOp basis van een fulltime dienstverband heb je ongeveer 50 vakantiedagen.\u003c/li\u003e\n\u003cli\u003eEen eindejaarsuitkering in de vorm van een dertiende maand is standaard.\u003c/li\u003e\n\u003cli\u003eEen mooie pensioenregeling.\u003c/li\u003e\n\u003cli\u003eWij bieden je een aanstelling voor 1 jaar. Bij goed functioneren krijg je na deze periode een vaste aanstelling.\u003c/li\u003e\n\u003cli\u003eWij bieden je een contract als Beleidsadviseur aan. Dit is de officiële naam van de functie.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e\u003cstrong\u003eBewuste keuze\u003c/strong\u003e\u003c/h2\u003e\n\u003cp\u003eJe bent ervan overtuigd dat deze functie bij je past en je hebt zin om aan de slag te gaan? Solliciteer dan direct, maar uiterlijk op donderdag 13 augustus 2020, via de 'Solliciteer' button.. Binnen enkele minuten ontvang je een automatische sollicitatiebevestiging. Wij streven ernaar je binnen 2 weken na de sluitingsdatum te informeren over de status van jouw sollicitatie. Bij vragen kun je contact opnemen met Mark Reijndorp, Program Manager Digitalisering bedrijfsvoering \u003ca href=\"mailto:mcc.reijndorp@avans.nl\"\u003emcc.reijndorp@avans.nl\u003c/a\u003e, 06-20104435 of met Herre Wynia, Adjunct Directeur van de Diensteenheid Financiën en Studentenadministratie, 06–51708371.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://vonq.io/32bAqzJ\"\u003eKlik hier om te solliciteren!\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eWe hebben de vacature zowel intern als extern uitgezet. Na de sluitingsdatum verwijderen wij de vacaturetekst van de website. Aan de inhoud van deze vacature kun je geen rechten ontlenen. Acquisitie naar aanleiding van deze tekst stellen wij niet op prijs.\u003c/p\u003e\n", - "how_to_apply": "\u003cp\u003e\u003ca href=\"https://vonq.io/32bAqzJ\"\u003eKlik hier om te solliciteren!\u003c/a\u003e\u003c/p\u003e\n", - "company_logo": "https://jobs.github.com/rails/active_storage/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBaUtHIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--811635464a644231f58bf5cffb52d475b7e77aae/avans%20hogeschool%20logo.jpeg" - }, - { - "id": "285aa472-990f-418d-b376-e03c27f48d17", - "type": "Full Time", - "url": "https://jobs.github.com/positions/285aa472-990f-418d-b376-e03c27f48d17", - "listingDate": "Wed Jul 15 14:22:21 UTC 2020", - "company": "OrbitalAds", - "company_url": "https://orbitalads.com", - "location": "Madrid (Spain)", - "title": "Quality Assurance Engineer", - "description": "\u003cp\u003eHi there! We’re growing the Engineering Team in our Madrid’s (Spain) office, and you can be a part of that journey as our Quality Assurance Engineer. Are you looking for an adventure?\u003c/p\u003e\n\u003cp\u003eIn OrbitalAds, we are a diverse team of passionate problem-solvers, working hard focused on optimizing the performance of Google Ads campaigns and accounts through the automation of keywords management. We do so through the development of in-house technology that we have packaged into a pretty cool product.\u003c/p\u003e\n\u003cp\u003eAs a QA Engineer, you’ll work closely with our Product, Backend and Frontend Teams. Our mission, as part of a QA Team, is to validate that all aspects of the product and related components are delivered according to agreed quality level to production. We are looking for a person who is capable of solving problems and adapt to different changes, working as a team\u003c/p\u003e\n\u003cp\u003eYou would be joining an agile, flexible and dynamic company. Sound good to you?\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eAs QA, you will:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eEstablish and evolve formal QA processes, ensuring that the team is using industry-accepted best practices.\u003c/li\u003e\n\u003cli\u003eOversee all aspects of quality assurance including establishing metrics, applying industry best practices, and developing new tools and processes to ensure quality goals are met.\u003c/li\u003e\n\u003cli\u003eDevelop and execute test cases, scripts, plans and procedures (manual and automated).\u003c/li\u003e\n\u003cli\u003eAct as the key point of contact for all QA aspects of releases, providing QA services and coordinating QA resources internally and externally.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eWhat skills do I need?\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAn analytical mindset.\u003c/li\u003e\n\u003cli\u003ePassion for new technologies.\u003c/li\u003e\n\u003cli\u003eHave the following soft skills: teamwork, good communication, problem-solving mindset.\u003c/li\u003e\n\u003cli\u003eFluent English.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eWhy you might NOT enjoy this position:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eYou want a highly-structured, predictable day-to-day\u003c/li\u003e\n\u003cli\u003eYou prefer to be managed; you act when asked and let others come up with ideas\u003c/li\u003e\n\u003cli\u003eFast-paced environments make your head spin\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eWhat do we offer you\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eA competitive salary\u003c/li\u003e\n\u003cli\u003eA flexible and fun working environment of startups in the very center of Madrid,\u003c/li\u003e\n\u003cli\u003eAn opportunity to be part of a team growing from the start.\u003c/li\u003e\n\u003cli\u003eAn office where everyone breathes SaaS and looks for scalable solutions.\u003c/li\u003e\n\u003cli\u003e“Best-in-class” colleagues; you’ll work alongside smart people who are hungry to learn and willing to teach you\u003c/li\u003e\n\u003cli\u003eYou’ll have the opportunity to help to create \u0026amp; shape our product and get your hands dirty with proper business-building experience.\u003c/li\u003e\n\u003cli\u003eEvents with the team – regular parties, happy hours, dinners and nerdy hobbies and games\u003c/li\u003e\n\u003cli\u003eHealthy Breakfast in the office to embrace your daily journey with the best energies\u003c/li\u003e\n\u003cli\u003eFlexible compensation like transportation, restaurant tickets and more\u003c/li\u003e\n\u003cli\u003eFun secondary benefits that we would love to hear your opinion on\u003c/li\u003e\n\u003cli\u003eFlexible Schedule to organize your own time under the natural constraints of your department and manager\u003c/li\u003e\n\u003cli\u003eMedical insurance once you pass the six month\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003eAll office related perks will be back after lockdown, currently we are a 100% remote working company. We would like for candidates to be able to at least come once a month to Madrid y all-team weeks.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eHope to hear from you!\u003c/p\u003e\n", - "how_to_apply": "\u003cp\u003eApply to this offer from our Recruitee site:\n\u003ca href=\"https://jobs.orbitalads.com/o/quality-assurance-engineer\"\u003ehttps://jobs.orbitalads.com/o/quality-assurance-engineer\u003c/a\u003e\u003c/p\u003e\n", - "company_logo": "https://jobs.github.com/rails/active_storage/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBaUNHIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--3c0a74d53b536ed4ac2410e4d9393c35ae434c1b/OA_1200X300.jpg" - }, - { - "id": "11cbce13-e6cd-4c79-b904-d292b569b22f", - "type": "Full Time", - "url": "https://jobs.github.com/positions/11cbce13-e6cd-4c79-b904-d292b569b22f", - "listingDate": "Wed Jul 15 12:17:30 UTC 2020", - "company": "OpenPlay", - "company_url": "http:", - "location": "Santa Monica", - "title": "Software Enginee", - "description": "\u003ch2\u003eCompany Description\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eHello, we’re OpenPlay!\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eWe’re looking for a full-stack engineer to work with us on our web-based music distribution application. You’ll work with us to design, develop, and deploy new application features for one of the world’s largest record companies. This is a full-time position that can be local (Los Angeles) or fully remote.\u003c/p\u003e\n\u003ch2\u003eWhat’s an OpenPlay?\u003c/h2\u003e\n\u003cp\u003eWe’re a small software team making distribution and workflow products for some of the world’s largest music companies. We’re big on testing, constant incremental improvement, craftsmanship, and pragmatism, and so far have been able to use those buzzwords to quickly deliver lots of features to keep the music industry running. We strive to make well engineered software that looks great and is friendly to use. We’re collaborative, supportive, enjoy learning, and most of all enthusiastic about building new things and making old things better.\u003c/p\u003e\n\u003ch2\u003eJob Description\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eWhat you’ll be doing:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cstrong\u003eRefining requirements.\u003c/strong\u003e We follow an agile process focused on rapid incremental delivery. You’ll take rough features born from an interesting idea, a customer request, or an overdue refactor (or a bug), and collaborate designing the user experience and technical direction necessary to release the next (or first) version.\u003c/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eProgramming.\u003c/strong\u003e It wouldn’t be an engineering position without some programming. We try to get to this step with minimal planning time so we can see how an idea takes shape in the real world. Our languages of choice are Ruby and Javascript. We tend to practice outside-in development: most features start with a rough end-to-end (or system, or integration, etc.) test, then we attach some UI, give it an endpoint to communicate with, and finally add in the persistence layer. You’ll be responsible for your feature iterations from start to finish, but you’ll have a team to help and design support for visual polish.\u003c/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eDeploying.\u003c/strong\u003e We offload and automate devops as much as possible, but a small part of every feature is still getting it deployed and ensuring it’s working as expected. We deploy features to production a few times per day on a typical day.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eSkills we’re looking for:\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cstrong\u003ePractical experience in full stack web application development.\u003c/strong\u003e At least a few years working on both the server and client side of production web applications. Experience with any client/server development (i.e. mobile) would probably also be pretty applicable. Console game development sounds really cool but probably wouldn’t transfer over as well. TI-86 calculator programming experience wouldn’t be a great fit either.\u003c/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eAcademic knowledge of software development.\u003c/strong\u003e In addition to being able to make something work, you’ll need to be able to research and articulate why it’s a particularly good solution. A computer science degree is one good barometer we’re looking for, but we understand it’s not the only path to understanding engineering principles and isn't required.\u003c/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eA desire to collaborate with others.\u003c/strong\u003e As a team we often discuss new and better ways to approach problems. We do code reviews and we write comments explaining our rationale when code looks smelly. If you enjoy thinking about new solutions to old problems, and can balance that with small, iterative, deliveries, you’ll probably enjoy working with us.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eQualifications\u003c/h2\u003e\n\u003cp\u003eKey technology experience:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cstrong\u003eRuby.\u003c/strong\u003e Experience with ruby would be ideal, but experience with other object-oriented dynamic languages would transfer over pretty well, especially python (you won’t be the only convert). Extensive experience in any programming language might fit as well. If you’re new to Ruby but enjoy object-oriented programming you’ll probably love it.\u003c/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eJavascript.\u003c/strong\u003e Experience with other semi-prototypal web-browser-based scripting languages with a nonsense hodge-podge standard library would probably transfer over too, but happily for the world we’re not sure any exist. In any case, the more experience you have with Javascript the better.\u003c/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eTesting.\u003c/strong\u003e The heart of our workflow is a full suite of end-to-end tests that we rely on to rapidly and safely build and deploy new features and refactor old code. Prior experience with test driven development or behavior driven development would be a big plus.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eMore specific technologies we use:\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eOur server-side code is MVC-structured and built around Sequel (ORM) and Sinatra. If you’re familiar with Rails or similar MVC frameworks you’ll feel at home pretty quickly.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOur core distribution product (OpenPlay Music) is a traditional multi-page application driven by server-side HTML and using Javascript to apply bits of dynamic behavior.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOur project management and workflow tool is a more recent single-page-application built in React and backed by Ruby communicating over JSON.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe enjoy both of them and think they are both appropriate technologies for different types of applications.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe do things typical of web applications like:\u003c/p\u003e\n\u003cp\u003eº Store data in and query from a relational database (PostgreSQL)\u003c/p\u003e\n\u003cp\u003eº Index data and query it with filtering and full text searching (Elasticsearch)\u003c/p\u003e\n\u003cp\u003eº Handle slow tasks with background processing\u003c/p\u003e\n\u003cp\u003eº Push notifications to clients with WebSockets\u003c/p\u003e\n\u003cp\u003eº Export XML files, PDFs, CSVs, Excel spreadsheets, and other formats that just won’t seem to go away\u003c/p\u003e\n\u003cp\u003eº Communicate with lots of external systems across all manner of APIs\u003c/p\u003e\n\u003cp\u003eº Provide a JSON API for our customers to build on top of\u003c/p\u003e\n\u003cp\u003eº Offload as much devops as possible to Heroku\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eAdditional Information\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eBenefits\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCompetitive compensation\u003c/li\u003e\n\u003cli\u003eMedical, dental, and vision insurance\u003c/li\u003e\n\u003cli\u003eWork life balance: We expect you to generally work 40 hours/week but understand that sometimes it’s summer. We might rarely have a big push where we end up working long hours. The last time this happened was in 2019 for about a week. The time before that was in 2016 for about 3 weeks.\u003c/li\u003e\n\u003cli\u003eFlexible work and vacation schedule: We have found so far that if the work is enjoyable it isn’t necessary to police when people are working. So we try to keep the work enjoyable.\u003c/li\u003e\n\u003cli\u003eFree to work remote: Our process works just as well in person or remote. It can sometimes even feel remote at the office when we’re sitting next to each other talking on Slack with our headphones in.\u003c/li\u003e\n\u003cli\u003eCompany Minecraft server with lots of odd elevated stone platforms.\u003c/li\u003e\n\u003cli\u003eOffice by the beach with a small-but-growing collection of vinyl figurines.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAll your information will be kept confidential according to EEO guidelines.\u003c/p\u003e\n\u003ch2\u003eInterested?\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://vonq.io/38Xr2kJ\"\u003eClick here to apply!\u003c/a\u003e\u003c/p\u003e\n", - "how_to_apply": "\u003cp\u003e\u003ca href=\"https://vonq.io/38Xr2kJ\"\u003eClick here to apply!\u003c/a\u003e\u003c/p\u003e\n", - "company_logo": "https://jobs.github.com/rails/active_storage/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBaGlHIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--768d7d0ec6983dfb25b4a5b7b4cfada6f9846a70/Openplay.jpeg" - } -] diff --git a/cypress/fixtures/jobDetails.json b/cypress/fixtures/jobDetails.json deleted file mode 100644 index 45b7a7d..0000000 --- a/cypress/fixtures/jobDetails.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "id": "f1884b46-ecb4-473c-81f5-08d9bf2ab3bb", - "type": "Full Time", - "url": "https://jobs.github.com/positions/f1884b46-ecb4-473c-81f5-08d9bf2ab3bb", - "listingDate": "Thu Jul 16 12:03:19 UTC 2020", - "company": "Cool Company", - "company_url": "https://www.adswizz.com/", - "location": "Bucharest", - "title": "Cloud DevOps Engineer", - "description": "\u003cp\u003eFor our Global Operations team in Bucharest, located at the 35th floor in Sky Tower building (highest in Romania), we are hiring a Cloud DevOps Engineer.\u003c/p\u003e\n\u003cp\u003eAs a Cloud DevOps Engineer you will:\n– Be curious. You ask \"why\"?, you explore, you’re not afraid to blurt out your crazy idea\n– Code the infrastructure to act as designed\n– Improve the whole life-cycle of services from design, through deployment, operation and refinement\n– Maintain services once they are live by measuring and monitoring availability, latency and overall system health\n– Scale systems sustainably through mechanisms like automation, and evolve systems by pushing for changes that improve reliability and velocity\n– Practice sustainable incident response and blameless postmortems\n– Have an opinion on any/all of the following orchestration tools\n– Be an audiophile – Interested in all things audio including but not limited to: sound quality, streaming technologies and best bands of 21st century\u003c/p\u003e\n\u003cp\u003eWhat you bring to the team:\n– Bachelor Degree in Computer Science, Mathematics and Informatics or equivalent\n– At least 2 years of experience working on large-scale distributed systems\n– Experience running Linux-based production systems\n– Your thinking starts with the desire for high availability\n– Your love for the command line and scripting development\n– Experience with Amazon AWS services (EC2, S3, ELB, …)\n– Experience with or related technologies like Puppet, Ansible, Nagios, Grafana, Prometheus, HAProxy, NGinx, Apache, MySQL/MariaDB, Kubernetes, Kafka, Hadoop\n– CI/CD for both infrastructure and applications\u003c/p\u003e\n\u003cp\u003eOur offer (bonuses, benefits) – what’s in it for you:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCasual \u0026amp; friendly working environment with opportunities to impact the company with your ideas and involvement\u003c/li\u003e\n\u003cli\u003eWe have a start-up culture, product-centric, international/multi-cultural environment in each office and easy going communication style (even with Top Management)\u003c/li\u003e\n\u003cli\u003eTechnology diversity, interesting technical exposure in building the best ad-tech product on the market\u003c/li\u003e\n\u003cli\u003eFlexible working schedule and work-from-home option, within predefined rules\u003c/li\u003e\n\u003cli\u003eIndividual training budget to use as you like for career improvement\u003c/li\u003e\n\u003cli\u003eBonus system, on top of base salary, paid quarterly (for real, not just on paper)\u003c/li\u003e\n\u003cli\u003ePaid days off related to quarterly performance\u003c/li\u003e\n\u003cli\u003eDay off on your birthday (or within that month if it falls on the weekend)\u003c/li\u003e\n\u003cli\u003eSports bonus for activities such as gym, dances, yoga, etc.\u003c/li\u003e\n\u003cli\u003eWe encourage your healthy life-style with company paid enrollment for running or biking events\u003c/li\u003e\n\u003cli\u003eMeal tickets\u003c/li\u003e\n\u003cli\u003eGift cards for special events (e.g.: Easter, 1st of June, 8th of March, Christmas)\u003c/li\u003e\n\u003cli\u003eMedical coverage to keep you healthy\u003c/li\u003e\n\u003cli\u003eParking lots at Sky Tower\u003c/li\u003e\n\u003cli\u003eAdsWizz technical books library – you can propose new technical books to be bought by the company\u003c/li\u003e\n\u003cli\u003eBookster subscription\u003c/li\u003e\n\u003cli\u003eGood hardware devices (new laptops / Mac’s, displays etc.)\u003c/li\u003e\n\u003cli\u003eOffice relaxation areas (ping-pong, foosball etc.)\u003c/li\u003e\n\u003cli\u003eTeam buildings – each team goes on outings to keep that flame alive\u003c/li\u003e\n\u003cli\u003eAnnual Christmas party – the best company party you’ve ever seen\u003c/li\u003e\n\u003cli\u003eFamily events (e.g.: Halloween and Christmas party for employees’ kids)\u003c/li\u003e\n\u003cli\u003eThemed team events nights (casino night, boardgames night, scary movies night, etc.)\u003c/li\u003e\n\u003cli\u003eCatered lunch-time meetings\u003c/li\u003e\n\u003cli\u003eWe have weekly fresh fruit along with coffee and tea to keep that brain in top shape, orange juice \u0026amp; vending machine on premise as well\u003c/li\u003e\n\u003cli\u003eCSR activities (cake auctions, yard sales, blood donation campaigns at our office)\nWanna see how Belgian chocolate goes with technology? Come and join a community of the smartest folks you’ve ever met, that want to aim for the sky and want to use their skills to make a difference!\u003c/li\u003e\n\u003c/ul\u003e\n", - "how_to_apply": "\u003cp\u003e\u003ca href=\"https://www.adswizz.com/our-careers#!/job/4528257002?utm_source=github\u0026amp;utm_medium=smartdreamers\u0026amp;utm_campaign=July_2020_%7C_Cloud_DevOps_Engineer_%7C_Bucharest\"\u003ehttps://www.adswizz.com/our-careers#!/job/4528257002?utm_source=github\u0026amp;utm_medium=smartdreamers\u0026amp;utm_campaign=July_2020_%7C_Cloud_DevOps_Engineer_%7C_Bucharest\u003c/a\u003e\u003c/p\u003e\n", - "company_logo": "https://jobs.github.com/rails/active_storage/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBanFHIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--0903e54cc814013e7ce5b39a629717629e033a4e/Adswizz.png" -} diff --git a/cypress/fixtures/jobsSearch1.json b/cypress/fixtures/jobsSearch1.json deleted file mode 100644 index 33cadbf..0000000 --- a/cypress/fixtures/jobsSearch1.json +++ /dev/null @@ -1,93 +0,0 @@ -[ - { - "id": 1, - "type": "Contract", - "url": "http://nbcnews.com/id/justo.html?ante=tellus&vestibulum=in&ante=sagittis&ipsum=dui&primis=vel&in=nisl&faucibus=duis&orci=ac&luctus=nibh&et=fusce&ultrices=lacus&posuere=purus&cubilia=aliquet&curae=at&duis=feugiat&faucibus=non&accumsan=pretium&odio=quis&curabitur=lectus&convallis=suspendisse&duis=potenti&consequat=in&dui=eleifend&nec=quam&nisi=a&volutpat=odio&eleifend=in&donec=hac&ut=habitasse&dolor=platea&morbi=dictumst&vel=maecenas&lectus=ut&in=massa&quam=quis&fringilla=augue&rhoncus=luctus&mauris=tincidunt&enim=nulla&leo=mollis", - "listingDate": "Thu Jul 16 12:03:19 UTC 2020", - "company": "Anderson LLC", - "company_url": "https://deliciousdays.com/consequat/lectus/in.png?nisl=nibh&aenean=fusce&lectus=lacus&pellentesque=purus&eget=aliquet&nunc=at&donec=feugiat&quis=non&orci=pretium&eget=quis&orci=lectus&vehicula=suspendisse&condimentum=potenti&curabitur=in&in=eleifend&libero=quam&ut=a&massa=odio&volutpat=in&convallis=hac&morbi=habitasse&odio=platea&odio=dictumst&elementum=maecenas&eu=ut&interdum=massa&eu=quis&tincidunt=augue&in=luctus&leo=tincidunt&maecenas=nulla&pulvinar=mollis&lobortis=molestie&est=lorem&phasellus=quisque&sit=ut", - "location": "Pennsylvania", - "title": "Analog Circuit Design manager", - "description": "", - "how_to_apply": "", - "company_logo": "http://dummyimage.com/155x185.png/cc0000/ffffff" - }, - { - "id": 2, - "type": "Contract", - "url": "https://posterous.com/et/ultrices/posuere/cubilia/curae/duis.json?nunc=non&purus=velit&phasellus=donec&in=diam&felis=neque&donec=vestibulum&semper=eget&sapien=vulputate&a=ut&libero=ultrices&nam=vel&dui=augue&proin=vestibulum&leo=ante&odio=ipsum&porttitor=primis&id=in&consequat=faucibus&in=orci&consequat=luctus&ut=et&nulla=ultrices&sed=posuere&accumsan=cubilia&felis=curae&ut=donec&at=pharetra&dolor=magna&quis=vestibulum&odio=aliquet&consequat=ultrices&varius=erat", - "listingDate": "Thu Jul 16 12:03:19 UTC 2020", - "company": "Herman-Kuhic", - "company_url": "http://weather.com/eleifend/donec/ut/dolor/morbi.json?tellus=augue&nisi=aliquam&eu=erat&orci=volutpat&mauris=in&lacinia=congue&sapien=etiam&quis=justo&libero=etiam&nullam=pretium&sit=iaculis&amet=justo&turpis=in&elementum=hac&ligula=habitasse&vehicula=platea&consequat=dictumst&morbi=etiam&a=faucibus&ipsum=cursus&integer=urna&a=ut&nibh=tellus&in=nulla&quis=ut&justo=erat&maecenas=id&rhoncus=mauris&aliquam=vulputate&lacus=elementum&morbi=nullam&quis=varius&tortor=nulla&id=facilisi&nulla=cras&ultrices=non&aliquet=velit&maecenas=nec&leo=nisi&odio=vulputate&condimentum=nonummy&id=maecenas&luctus=tincidunt&nec=lacus&molestie=at&sed=velit&justo=vivamus&pellentesque=vel&viverra=nulla&pede=eget&ac=eros&diam=elementum&cras=pellentesque&pellentesque=quisque&volutpat=porta&dui=volutpat&maecenas=erat&tristique=quisque&est=erat&et=eros&tempus=viverra&semper=eget&est=congue&quam=eget&pharetra=semper&magna=rutrum&ac=nulla&consequat=nunc&metus=purus&sapien=phasellus&ut=in&nunc=felis&vestibulum=donec&ante=semper&ipsum=sapien&primis=a&in=libero&faucibus=nam&orci=dui&luctus=proin&et=leo&ultrices=odio&posuere=porttitor&cubilia=id&curae=consequat&mauris=in&viverra=consequat&diam=ut", - "location": "California", - "title": "Operator", - "description": "", - "how_to_apply": "", - "company_logo": "http://dummyimage.com/185x224.jpg/cc0000/ffffff" - }, - { - "id": 3, - "type": "Contract", - "url": "https://craigslist.org/luctus/rutrum.png?vestibulum=elit&rutrum=proin&rutrum=risus&neque=praesent&aenean=lectus&auctor=vestibulum&gravida=quam&sem=sapien&praesent=varius&id=ut&massa=blandit&id=non&nisl=interdum&venenatis=in&lacinia=ante&aenean=vestibulum&sit=ante&amet=ipsum&justo=primis&morbi=in&ut=faucibus&odio=orci&cras=luctus&mi=et&pede=ultrices&malesuada=posuere&in=cubilia&imperdiet=curae&et=duis&commodo=faucibus&vulputate=accumsan&justo=odio&in=curabitur&blandit=convallis&ultrices=duis&enim=consequat&lorem=dui&ipsum=nec&dolor=nisi&sit=volutpat&amet=eleifend&consectetuer=donec&adipiscing=ut&elit=dolor&proin=morbi&interdum=vel&mauris=lectus&non=in&ligula=quam&pellentesque=fringilla&ultrices=rhoncus&phasellus=mauris&id=enim&sapien=leo&in=rhoncus&sapien=sed&iaculis=vestibulum&congue=sit&vivamus=amet&metus=cursus&arcu=id&adipiscing=turpis&molestie=integer&hendrerit=aliquet&at=massa&vulputate=id&vitae=lobortis&nisl=convallis&aenean=tortor&lectus=risus&pellentesque=dapibus&eget=augue&nunc=vel&donec=accumsan&quis=tellus&orci=nisi&eget=eu&orci=orci&vehicula=mauris&condimentum=lacinia&curabitur=sapien&in=quis&libero=libero&ut=nullam&massa=sit&volutpat=amet&convallis=turpis&morbi=elementum&odio=ligula&odio=vehicula&elementum=consequat&eu=morbi&interdum=a", - "listingDate": "Thu Jul 16 12:03:19 UTC 2020", - "company": "Howe-Becker", - "company_url": "https://boston.com/orci/luctus/et/ultrices.jpg?condimentum=semper&neque=est&sapien=quam&placerat=pharetra&ante=magna&nulla=ac&justo=consequat&aliquam=metus&quis=sapien&turpis=ut&eget=nunc&elit=vestibulum&sodales=ante&scelerisque=ipsum&mauris=primis&sit=in&amet=faucibus&eros=orci&suspendisse=luctus&accumsan=et&tortor=ultrices&quis=posuere&turpis=cubilia&sed=curae&ante=mauris&vivamus=viverra&tortor=diam&duis=vitae&mattis=quam&egestas=suspendisse&metus=potenti&aenean=nullam&fermentum=porttitor&donec=lacus&ut=at&mauris=turpis&eget=donec&massa=posuere&tempor=metus&convallis=vitae&nulla=ipsum&neque=aliquam&libero=non&convallis=mauris&eget=morbi&eleifend=non&luctus=lectus&ultricies=aliquam&eu=sit&nibh=amet&quisque=diam&id=in&justo=magna&sit=bibendum&amet=imperdiet&sapien=nullam&dignissim=orci&vestibulum=pede&vestibulum=venenatis&ante=non&ipsum=sodales&primis=sed&in=tincidunt&faucibus=eu&orci=felis&luctus=fusce&et=posuere&ultrices=felis&posuere=sed&cubilia=lacus&curae=morbi&nulla=sem&dapibus=mauris&dolor=laoreet&vel=ut&est=rhoncus&donec=aliquet&odio=pulvinar&justo=sed&sollicitudin=nisl&ut=nunc&suscipit=rhoncus&a=dui&feugiat=vel&et=sem&eros=sed&vestibulum=sagittis&ac=nam&est=congue&lacinia=risus&nisi=semper&venenatis=porta&tristique=volutpat&fusce=quam", - "location": "Oregon", - "title": "Software Test Engineer I", - "description": "", - "how_to_apply": "", - "company_logo": "http://dummyimage.com/111x130.bmp/5fa2dd/ffffff" - }, - { - "id": 4, - "type": "Full Time", - "url": "http://usa.gov/at/diam/nam/tristique/tortor/eu/pede.jsp?in=turpis&blandit=adipiscing&ultrices=lorem&enim=vitae&lorem=mattis&ipsum=nibh&dolor=ligula&sit=nec&amet=sem&consectetuer=duis&adipiscing=aliquam&elit=convallis&proin=nunc", - "listingDate": "Thu Jul 16 12:03:19 UTC 2020", - "company": "Wolff LLC", - "company_url": "http://time.com/congue.jsp?pretium=turpis&iaculis=enim&justo=blandit&in=mi&hac=in&habitasse=porttitor&platea=pede&dictumst=justo&etiam=eu&faucibus=massa&cursus=donec&urna=dapibus&ut=duis&tellus=at&nulla=velit&ut=eu&erat=est&id=congue", - "location": "Texas", - "title": "Staff Scientist", - "description": "", - "how_to_apply": "", - "company_logo": "http://dummyimage.com/122x234.bmp/5fa2dd/ffffff" - }, - { - "id": 5, - "type": "Contract", - "url": "http://yelp.com/lectus/aliquam/sit/amet/diam.png?orci=ante&mauris=vel&lacinia=ipsum&sapien=praesent&quis=blandit&libero=lacinia&nullam=erat&sit=vestibulum&amet=sed&turpis=magna&elementum=at&ligula=nunc&vehicula=commodo&consequat=placerat&morbi=praesent&a=blandit&ipsum=nam&integer=nulla&a=integer&nibh=pede&in=justo&quis=lacinia&justo=eget&maecenas=tincidunt&rhoncus=eget&aliquam=tempus&lacus=vel&morbi=pede&quis=morbi&tortor=porttitor&id=lorem&nulla=id&ultrices=ligula&aliquet=suspendisse&maecenas=ornare&leo=consequat&odio=lectus&condimentum=in&id=est&luctus=risus&nec=auctor&molestie=sed&sed=tristique&justo=in&pellentesque=tempus&viverra=sit&pede=amet&ac=sem&diam=fusce&cras=consequat&pellentesque=nulla&volutpat=nisl&dui=nunc&maecenas=nisl&tristique=duis&est=bibendum&et=felis&tempus=sed&semper=interdum&est=venenatis&quam=turpis&pharetra=enim&magna=blandit&ac=mi&consequat=in&metus=porttitor&sapien=pede&ut=justo&nunc=eu&vestibulum=massa&ante=donec&ipsum=dapibus&primis=duis&in=at&faucibus=velit&orci=eu&luctus=est&et=congue&ultrices=elementum&posuere=in&cubilia=hac&curae=habitasse", - "listingDate": "Thu Jul 16 12:03:19 UTC 2020", - "company": "Senger-Gerhold", - "company_url": "http://yellowbook.com/nisl/nunc/rhoncus/dui.html?ipsum=cras&integer=non&a=velit&nibh=nec&in=nisi&quis=vulputate&justo=nonummy&maecenas=maecenas&rhoncus=tincidunt&aliquam=lacus&lacus=at&morbi=velit&quis=vivamus&tortor=vel&id=nulla&nulla=eget&ultrices=eros&aliquet=elementum&maecenas=pellentesque&leo=quisque&odio=porta&condimentum=volutpat&id=erat&luctus=quisque&nec=erat&molestie=eros&sed=viverra&justo=eget&pellentesque=congue&viverra=eget&pede=semper&ac=rutrum&diam=nulla&cras=nunc&pellentesque=purus&volutpat=phasellus&dui=in&maecenas=felis&tristique=donec&est=semper&et=sapien&tempus=a&semper=libero&est=nam&quam=dui&pharetra=proin&magna=leo&ac=odio&consequat=porttitor&metus=id&sapien=consequat&ut=in&nunc=consequat&vestibulum=ut&ante=nulla&ipsum=sed&primis=accumsan&in=felis&faucibus=ut&orci=at&luctus=dolor&et=quis&ultrices=odio&posuere=consequat&cubilia=varius&curae=integer&mauris=ac&viverra=leo&diam=pellentesque&vitae=ultrices", - "location": "Texas", - "title": "Environmental Tech", - "description": "", - "how_to_apply": "", - "company_logo": "http://dummyimage.com/162x190.png/cc0000/ffffff" - }, - { - "id": 6, - "type": "Contract", - "url": "http://shinystat.com/ultricies/eu/nibh/quisque/id/justo.xml?at=nisl&turpis=duis&a=bibendum&pede=felis&posuere=sed&nonummy=interdum&integer=venenatis&non=turpis&velit=enim&donec=blandit&diam=mi&neque=in&vestibulum=porttitor&eget=pede&vulputate=justo&ut=eu&ultrices=massa&vel=donec&augue=dapibus&vestibulum=duis&ante=at&ipsum=velit&primis=eu&in=est&faucibus=congue&orci=elementum&luctus=in&et=hac&ultrices=habitasse&posuere=platea&cubilia=dictumst&curae=morbi&donec=vestibulum&pharetra=velit&magna=id&vestibulum=pretium&aliquet=iaculis&ultrices=diam&erat=erat&tortor=fermentum", - "listingDate": "Thu Jul 16 12:03:19 UTC 2020", - "company": "Zulauf, Reynolds and Green", - "company_url": "http://cyberchimps.com/fusce/congue/diam/id.json?aliquam=nulla&non=tempus&mauris=vivamus&morbi=in&non=felis&lectus=eu&aliquam=sapien&sit=cursus&amet=vestibulum&diam=proin&in=eu&magna=mi&bibendum=nulla&imperdiet=ac&nullam=enim&orci=in&pede=tempor&venenatis=turpis&non=nec&sodales=euismod&sed=scelerisque&tincidunt=quam&eu=turpis&felis=adipiscing&fusce=lorem&posuere=vitae&felis=mattis&sed=nibh&lacus=ligula&morbi=nec&sem=sem&mauris=duis&laoreet=aliquam&ut=convallis&rhoncus=nunc&aliquet=proin&pulvinar=at&sed=turpis&nisl=a&nunc=pede&rhoncus=posuere&dui=nonummy&vel=integer&sem=non&sed=velit&sagittis=donec&nam=diam&congue=neque&risus=vestibulum&semper=eget&porta=vulputate&volutpat=ut&quam=ultrices&pede=vel&lobortis=augue&ligula=vestibulum&sit=ante&amet=ipsum&eleifend=primis&pede=in&libero=faucibus&quis=orci&orci=luctus&nullam=et&molestie=ultrices&nibh=posuere", - "location": "New York", - "title": "Director of Sales", - "description": "", - "how_to_apply": "", - "company_logo": "http://dummyimage.com/225x233.jpg/5fa2dd/ffffff" - }, - { - "id": 7, - "type": "Full Time", - "url": "http://reverbnation.com/luctus.js?viverra=eu&diam=magna&vitae=vulputate&quam=luctus&suspendisse=cum&potenti=sociis&nullam=natoque&porttitor=penatibus&lacus=et&at=magnis&turpis=dis&donec=parturient&posuere=montes&metus=nascetur&vitae=ridiculus&ipsum=mus&aliquam=vivamus&non=vestibulum&mauris=sagittis&morbi=sapien&non=cum&lectus=sociis&aliquam=natoque&sit=penatibus&amet=et&diam=magnis&in=dis&magna=parturient&bibendum=montes&imperdiet=nascetur&nullam=ridiculus&orci=mus&pede=etiam&venenatis=vel&non=augue&sodales=vestibulum&sed=rutrum&tincidunt=rutrum&eu=neque&felis=aenean&fusce=auctor&posuere=gravida&felis=sem&sed=praesent&lacus=id&morbi=massa&sem=id&mauris=nisl&laoreet=venenatis&ut=lacinia&rhoncus=aenean&aliquet=sit&pulvinar=amet&sed=justo&nisl=morbi&nunc=ut&rhoncus=odio&dui=cras&vel=mi", - "listingDate": "Thu Jul 16 12:03:19 UTC 2020", - "company": "VonRueden and Sons", - "company_url": "http://wix.com/ante/vestibulum/ante/ipsum/primis/in.aspx?vivamus=habitasse&tortor=platea&duis=dictumst&mattis=etiam&egestas=faucibus&metus=cursus&aenean=urna&fermentum=ut&donec=tellus&ut=nulla&mauris=ut&eget=erat&massa=id&tempor=mauris&convallis=vulputate&nulla=elementum&neque=nullam&libero=varius&convallis=nulla&eget=facilisi&eleifend=cras&luctus=non&ultricies=velit&eu=nec&nibh=nisi&quisque=vulputate&id=nonummy&justo=maecenas&sit=tincidunt&amet=lacus&sapien=at&dignissim=velit&vestibulum=vivamus&vestibulum=vel&ante=nulla&ipsum=eget&primis=eros&in=elementum&faucibus=pellentesque&orci=quisque&luctus=porta&et=volutpat&ultrices=erat&posuere=quisque&cubilia=erat&curae=eros&nulla=viverra&dapibus=eget&dolor=congue&vel=eget&est=semper&donec=rutrum&odio=nulla&justo=nunc&sollicitudin=purus&ut=phasellus&suscipit=in&a=felis&feugiat=donec&et=semper&eros=sapien&vestibulum=a&ac=libero&est=nam&lacinia=dui&nisi=proin&venenatis=leo&tristique=odio&fusce=porttitor", - "location": "California", - "title": "Legal Assistant", - "description": "", - "how_to_apply": "", - "company_logo": "http://dummyimage.com/186x179.png/5fa2dd/ffffff" - } -] diff --git a/cypress/fixtures/jobsSearch2.json b/cypress/fixtures/jobsSearch2.json deleted file mode 100644 index 00fd014..0000000 --- a/cypress/fixtures/jobsSearch2.json +++ /dev/null @@ -1,54 +0,0 @@ -[ - { - "id": 1, - "type": "Full Time", - "url": "http://nbcnews.com/id/justo.html?ante=tellus&vestibulum=in&ante=sagittis&ipsum=dui&primis=vel&in=nisl&faucibus=duis&orci=ac&luctus=nibh&et=fusce&ultrices=lacus&posuere=purus&cubilia=aliquet&curae=at&duis=feugiat&faucibus=non&accumsan=pretium&odio=quis&curabitur=lectus&convallis=suspendisse&duis=potenti&consequat=in&dui=eleifend&nec=quam&nisi=a&volutpat=odio&eleifend=in&donec=hac&ut=habitasse&dolor=platea&morbi=dictumst&vel=maecenas&lectus=ut&in=massa&quam=quis&fringilla=augue&rhoncus=luctus&mauris=tincidunt&enim=nulla&leo=mollis", - "listingDate": "Thu Jul 16 12:03:19 UTC 2020", - "company": "Anderson LLC", - "company_url": "https://deliciousdays.com/consequat/lectus/in.png?nisl=nibh&aenean=fusce&lectus=lacus&pellentesque=purus&eget=aliquet&nunc=at&donec=feugiat&quis=non&orci=pretium&eget=quis&orci=lectus&vehicula=suspendisse&condimentum=potenti&curabitur=in&in=eleifend&libero=quam&ut=a&massa=odio&volutpat=in&convallis=hac&morbi=habitasse&odio=platea&odio=dictumst&elementum=maecenas&eu=ut&interdum=massa&eu=quis&tincidunt=augue&in=luctus&leo=tincidunt&maecenas=nulla&pulvinar=mollis&lobortis=molestie&est=lorem&phasellus=quisque&sit=ut", - "location": "Pennsylvania", - "title": "Analog Circuit Design manager", - "description": "", - "how_to_apply": "", - "company_logo": "http://dummyimage.com/155x185.png/cc0000/ffffff" - }, - { - "id": 2, - "type": "Full Time", - "url": "https://posterous.com/et/ultrices/posuere/cubilia/curae/duis.json?nunc=non&purus=velit&phasellus=donec&in=diam&felis=neque&donec=vestibulum&semper=eget&sapien=vulputate&a=ut&libero=ultrices&nam=vel&dui=augue&proin=vestibulum&leo=ante&odio=ipsum&porttitor=primis&id=in&consequat=faucibus&in=orci&consequat=luctus&ut=et&nulla=ultrices&sed=posuere&accumsan=cubilia&felis=curae&ut=donec&at=pharetra&dolor=magna&quis=vestibulum&odio=aliquet&consequat=ultrices&varius=erat", - "listingDate": "Thu Jul 16 12:03:19 UTC 2020", - "company": "Herman-Kuhic", - "company_url": "http://weather.com/eleifend/donec/ut/dolor/morbi.json?tellus=augue&nisi=aliquam&eu=erat&orci=volutpat&mauris=in&lacinia=congue&sapien=etiam&quis=justo&libero=etiam&nullam=pretium&sit=iaculis&amet=justo&turpis=in&elementum=hac&ligula=habitasse&vehicula=platea&consequat=dictumst&morbi=etiam&a=faucibus&ipsum=cursus&integer=urna&a=ut&nibh=tellus&in=nulla&quis=ut&justo=erat&maecenas=id&rhoncus=mauris&aliquam=vulputate&lacus=elementum&morbi=nullam&quis=varius&tortor=nulla&id=facilisi&nulla=cras&ultrices=non&aliquet=velit&maecenas=nec&leo=nisi&odio=vulputate&condimentum=nonummy&id=maecenas&luctus=tincidunt&nec=lacus&molestie=at&sed=velit&justo=vivamus&pellentesque=vel&viverra=nulla&pede=eget&ac=eros&diam=elementum&cras=pellentesque&pellentesque=quisque&volutpat=porta&dui=volutpat&maecenas=erat&tristique=quisque&est=erat&et=eros&tempus=viverra&semper=eget&est=congue&quam=eget&pharetra=semper&magna=rutrum&ac=nulla&consequat=nunc&metus=purus&sapien=phasellus&ut=in&nunc=felis&vestibulum=donec&ante=semper&ipsum=sapien&primis=a&in=libero&faucibus=nam&orci=dui&luctus=proin&et=leo&ultrices=odio&posuere=porttitor&cubilia=id&curae=consequat&mauris=in&viverra=consequat&diam=ut", - "location": "California", - "title": "Operator", - "description": "", - "how_to_apply": "", - "company_logo": "http://dummyimage.com/185x224.jpg/cc0000/ffffff" - }, - { - "id": 3, - "type": "Full Time", - "url": "https://craigslist.org/luctus/rutrum.png?vestibulum=elit&rutrum=proin&rutrum=risus&neque=praesent&aenean=lectus&auctor=vestibulum&gravida=quam&sem=sapien&praesent=varius&id=ut&massa=blandit&id=non&nisl=interdum&venenatis=in&lacinia=ante&aenean=vestibulum&sit=ante&amet=ipsum&justo=primis&morbi=in&ut=faucibus&odio=orci&cras=luctus&mi=et&pede=ultrices&malesuada=posuere&in=cubilia&imperdiet=curae&et=duis&commodo=faucibus&vulputate=accumsan&justo=odio&in=curabitur&blandit=convallis&ultrices=duis&enim=consequat&lorem=dui&ipsum=nec&dolor=nisi&sit=volutpat&amet=eleifend&consectetuer=donec&adipiscing=ut&elit=dolor&proin=morbi&interdum=vel&mauris=lectus&non=in&ligula=quam&pellentesque=fringilla&ultrices=rhoncus&phasellus=mauris&id=enim&sapien=leo&in=rhoncus&sapien=sed&iaculis=vestibulum&congue=sit&vivamus=amet&metus=cursus&arcu=id&adipiscing=turpis&molestie=integer&hendrerit=aliquet&at=massa&vulputate=id&vitae=lobortis&nisl=convallis&aenean=tortor&lectus=risus&pellentesque=dapibus&eget=augue&nunc=vel&donec=accumsan&quis=tellus&orci=nisi&eget=eu&orci=orci&vehicula=mauris&condimentum=lacinia&curabitur=sapien&in=quis&libero=libero&ut=nullam&massa=sit&volutpat=amet&convallis=turpis&morbi=elementum&odio=ligula&odio=vehicula&elementum=consequat&eu=morbi&interdum=a", - "listingDate": "Thu Jul 16 12:03:19 UTC 2020", - "company": "Howe-Becker", - "company_url": "https://boston.com/orci/luctus/et/ultrices.jpg?condimentum=semper&neque=est&sapien=quam&placerat=pharetra&ante=magna&nulla=ac&justo=consequat&aliquam=metus&quis=sapien&turpis=ut&eget=nunc&elit=vestibulum&sodales=ante&scelerisque=ipsum&mauris=primis&sit=in&amet=faucibus&eros=orci&suspendisse=luctus&accumsan=et&tortor=ultrices&quis=posuere&turpis=cubilia&sed=curae&ante=mauris&vivamus=viverra&tortor=diam&duis=vitae&mattis=quam&egestas=suspendisse&metus=potenti&aenean=nullam&fermentum=porttitor&donec=lacus&ut=at&mauris=turpis&eget=donec&massa=posuere&tempor=metus&convallis=vitae&nulla=ipsum&neque=aliquam&libero=non&convallis=mauris&eget=morbi&eleifend=non&luctus=lectus&ultricies=aliquam&eu=sit&nibh=amet&quisque=diam&id=in&justo=magna&sit=bibendum&amet=imperdiet&sapien=nullam&dignissim=orci&vestibulum=pede&vestibulum=venenatis&ante=non&ipsum=sodales&primis=sed&in=tincidunt&faucibus=eu&orci=felis&luctus=fusce&et=posuere&ultrices=felis&posuere=sed&cubilia=lacus&curae=morbi&nulla=sem&dapibus=mauris&dolor=laoreet&vel=ut&est=rhoncus&donec=aliquet&odio=pulvinar&justo=sed&sollicitudin=nisl&ut=nunc&suscipit=rhoncus&a=dui&feugiat=vel&et=sem&eros=sed&vestibulum=sagittis&ac=nam&est=congue&lacinia=risus&nisi=semper&venenatis=porta&tristique=volutpat&fusce=quam", - "location": "Oregon", - "title": "Software Test Engineer I", - "description": "", - "how_to_apply": "", - "company_logo": "http://dummyimage.com/111x130.bmp/5fa2dd/ffffff" - }, - { - "id": 4, - "type": "Full Time", - "url": "http://usa.gov/at/diam/nam/tristique/tortor/eu/pede.jsp?in=turpis&blandit=adipiscing&ultrices=lorem&enim=vitae&lorem=mattis&ipsum=nibh&dolor=ligula&sit=nec&amet=sem&consectetuer=duis&adipiscing=aliquam&elit=convallis&proin=nunc", - "listingDate": "Thu Jul 16 12:03:19 UTC 2020", - "company": "Wolff LLC", - "company_url": "http://time.com/congue.jsp?pretium=turpis&iaculis=enim&justo=blandit&in=mi&hac=in&habitasse=porttitor&platea=pede&dictumst=justo&etiam=eu&faucibus=massa&cursus=donec&urna=dapibus&ut=duis&tellus=at&nulla=velit&ut=eu&erat=est&id=congue", - "location": "Texas", - "title": "Staff Scientist", - "description": "", - "how_to_apply": "", - "company_logo": "http://dummyimage.com/122x234.bmp/5fa2dd/ffffff" - } -] diff --git a/cypress/fixtures/jobsSearch3.json b/cypress/fixtures/jobsSearch3.json deleted file mode 100644 index e9506c0..0000000 --- a/cypress/fixtures/jobsSearch3.json +++ /dev/null @@ -1,41 +0,0 @@ -[ - { - "id": 1, - "type": "Contract", - "url": "http://nbcnews.com/id/justo.html?ante=tellus&vestibulum=in&ante=sagittis&ipsum=dui&primis=vel&in=nisl&faucibus=duis&orci=ac&luctus=nibh&et=fusce&ultrices=lacus&posuere=purus&cubilia=aliquet&curae=at&duis=feugiat&faucibus=non&accumsan=pretium&odio=quis&curabitur=lectus&convallis=suspendisse&duis=potenti&consequat=in&dui=eleifend&nec=quam&nisi=a&volutpat=odio&eleifend=in&donec=hac&ut=habitasse&dolor=platea&morbi=dictumst&vel=maecenas&lectus=ut&in=massa&quam=quis&fringilla=augue&rhoncus=luctus&mauris=tincidunt&enim=nulla&leo=mollis", - "listingDate": "Thu Jul 16 12:03:19 UTC 2020", - "company": "Anderson LLC", - "company_url": "https://deliciousdays.com/consequat/lectus/in.png?nisl=nibh&aenean=fusce&lectus=lacus&pellentesque=purus&eget=aliquet&nunc=at&donec=feugiat&quis=non&orci=pretium&eget=quis&orci=lectus&vehicula=suspendisse&condimentum=potenti&curabitur=in&in=eleifend&libero=quam&ut=a&massa=odio&volutpat=in&convallis=hac&morbi=habitasse&odio=platea&odio=dictumst&elementum=maecenas&eu=ut&interdum=massa&eu=quis&tincidunt=augue&in=luctus&leo=tincidunt&maecenas=nulla&pulvinar=mollis&lobortis=molestie&est=lorem&phasellus=quisque&sit=ut", - "location": "Pennsylvania", - "title": "Analog Circuit Design manager", - "description": "", - "how_to_apply": "", - "company_logo": "http://dummyimage.com/155x185.png/cc0000/ffffff" - }, - { - "id": 2, - "type": "Contract", - "url": "https://posterous.com/et/ultrices/posuere/cubilia/curae/duis.json?nunc=non&purus=velit&phasellus=donec&in=diam&felis=neque&donec=vestibulum&semper=eget&sapien=vulputate&a=ut&libero=ultrices&nam=vel&dui=augue&proin=vestibulum&leo=ante&odio=ipsum&porttitor=primis&id=in&consequat=faucibus&in=orci&consequat=luctus&ut=et&nulla=ultrices&sed=posuere&accumsan=cubilia&felis=curae&ut=donec&at=pharetra&dolor=magna&quis=vestibulum&odio=aliquet&consequat=ultrices&varius=erat", - "listingDate": "Thu Jul 16 12:03:19 UTC 2020", - "company": "Herman-Kuhic", - "company_url": "http://weather.com/eleifend/donec/ut/dolor/morbi.json?tellus=augue&nisi=aliquam&eu=erat&orci=volutpat&mauris=in&lacinia=congue&sapien=etiam&quis=justo&libero=etiam&nullam=pretium&sit=iaculis&amet=justo&turpis=in&elementum=hac&ligula=habitasse&vehicula=platea&consequat=dictumst&morbi=etiam&a=faucibus&ipsum=cursus&integer=urna&a=ut&nibh=tellus&in=nulla&quis=ut&justo=erat&maecenas=id&rhoncus=mauris&aliquam=vulputate&lacus=elementum&morbi=nullam&quis=varius&tortor=nulla&id=facilisi&nulla=cras&ultrices=non&aliquet=velit&maecenas=nec&leo=nisi&odio=vulputate&condimentum=nonummy&id=maecenas&luctus=tincidunt&nec=lacus&molestie=at&sed=velit&justo=vivamus&pellentesque=vel&viverra=nulla&pede=eget&ac=eros&diam=elementum&cras=pellentesque&pellentesque=quisque&volutpat=porta&dui=volutpat&maecenas=erat&tristique=quisque&est=erat&et=eros&tempus=viverra&semper=eget&est=congue&quam=eget&pharetra=semper&magna=rutrum&ac=nulla&consequat=nunc&metus=purus&sapien=phasellus&ut=in&nunc=felis&vestibulum=donec&ante=semper&ipsum=sapien&primis=a&in=libero&faucibus=nam&orci=dui&luctus=proin&et=leo&ultrices=odio&posuere=porttitor&cubilia=id&curae=consequat&mauris=in&viverra=consequat&diam=ut", - "location": "California", - "title": "Operator", - "description": "", - "how_to_apply": "", - "company_logo": "http://dummyimage.com/185x224.jpg/cc0000/ffffff" - }, - { - "id": 3, - "type": "Contract", - "url": "https://craigslist.org/luctus/rutrum.png?vestibulum=elit&rutrum=proin&rutrum=risus&neque=praesent&aenean=lectus&auctor=vestibulum&gravida=quam&sem=sapien&praesent=varius&id=ut&massa=blandit&id=non&nisl=interdum&venenatis=in&lacinia=ante&aenean=vestibulum&sit=ante&amet=ipsum&justo=primis&morbi=in&ut=faucibus&odio=orci&cras=luctus&mi=et&pede=ultrices&malesuada=posuere&in=cubilia&imperdiet=curae&et=duis&commodo=faucibus&vulputate=accumsan&justo=odio&in=curabitur&blandit=convallis&ultrices=duis&enim=consequat&lorem=dui&ipsum=nec&dolor=nisi&sit=volutpat&amet=eleifend&consectetuer=donec&adipiscing=ut&elit=dolor&proin=morbi&interdum=vel&mauris=lectus&non=in&ligula=quam&pellentesque=fringilla&ultrices=rhoncus&phasellus=mauris&id=enim&sapien=leo&in=rhoncus&sapien=sed&iaculis=vestibulum&congue=sit&vivamus=amet&metus=cursus&arcu=id&adipiscing=turpis&molestie=integer&hendrerit=aliquet&at=massa&vulputate=id&vitae=lobortis&nisl=convallis&aenean=tortor&lectus=risus&pellentesque=dapibus&eget=augue&nunc=vel&donec=accumsan&quis=tellus&orci=nisi&eget=eu&orci=orci&vehicula=mauris&condimentum=lacinia&curabitur=sapien&in=quis&libero=libero&ut=nullam&massa=sit&volutpat=amet&convallis=turpis&morbi=elementum&odio=ligula&odio=vehicula&elementum=consequat&eu=morbi&interdum=a", - "listingDate": "Thu Jul 16 12:03:19 UTC 2020", - "company": "Howe-Becker", - "company_url": "https://boston.com/orci/luctus/et/ultrices.jpg?condimentum=semper&neque=est&sapien=quam&placerat=pharetra&ante=magna&nulla=ac&justo=consequat&aliquam=metus&quis=sapien&turpis=ut&eget=nunc&elit=vestibulum&sodales=ante&scelerisque=ipsum&mauris=primis&sit=in&amet=faucibus&eros=orci&suspendisse=luctus&accumsan=et&tortor=ultrices&quis=posuere&turpis=cubilia&sed=curae&ante=mauris&vivamus=viverra&tortor=diam&duis=vitae&mattis=quam&egestas=suspendisse&metus=potenti&aenean=nullam&fermentum=porttitor&donec=lacus&ut=at&mauris=turpis&eget=donec&massa=posuere&tempor=metus&convallis=vitae&nulla=ipsum&neque=aliquam&libero=non&convallis=mauris&eget=morbi&eleifend=non&luctus=lectus&ultricies=aliquam&eu=sit&nibh=amet&quisque=diam&id=in&justo=magna&sit=bibendum&amet=imperdiet&sapien=nullam&dignissim=orci&vestibulum=pede&vestibulum=venenatis&ante=non&ipsum=sodales&primis=sed&in=tincidunt&faucibus=eu&orci=felis&luctus=fusce&et=posuere&ultrices=felis&posuere=sed&cubilia=lacus&curae=morbi&nulla=sem&dapibus=mauris&dolor=laoreet&vel=ut&est=rhoncus&donec=aliquet&odio=pulvinar&justo=sed&sollicitudin=nisl&ut=nunc&suscipit=rhoncus&a=dui&feugiat=vel&et=sem&eros=sed&vestibulum=sagittis&ac=nam&est=congue&lacinia=risus&nisi=semper&venenatis=porta&tristique=volutpat&fusce=quam", - "location": "Oregon", - "title": "Software Test Engineer I", - "description": "", - "how_to_apply": "", - "company_logo": "http://dummyimage.com/111x130.bmp/5fa2dd/ffffff" - } -] diff --git a/cypress/fixtures/login.json b/cypress/fixtures/login.json deleted file mode 100644 index 91f4df4..0000000 --- a/cypress/fixtures/login.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "_id": "5f341627b640c36fd616c300", - "email": "bobtest@email.com", - "name": "Bob Test", - "createdAt": "2020-07-20T21:09:00.323Z", - "updatedAt": "2020-07-20T21:12:01.627Z", - "__v": 1 -} \ No newline at end of file diff --git a/cypress/fixtures/savedDetails.json b/cypress/fixtures/savedDetails.json deleted file mode 100644 index 770df96..0000000 --- a/cypress/fixtures/savedDetails.json +++ /dev/null @@ -1,80 +0,0 @@ -[ - { - "id": "f1884b46-ecb4-473c-81f5-08d9bf2ab3bb", - "type": "Full Time", - "url": "https://jobs.github.com/positions/f1884b46-ecb4-473c-81f5-08d9bf2ab3bb", - "listingDate": "Thu Jul 16 12:03:19 UTC 2020", - "company": "Cool Company", - "company_url": "https://www.adswizz.com/", - "location": "Bucharest", - "title": "Cloud DevOps Engineer", - "description": "\u003cp\u003eFor our Global Operations team in Bucharest, located at the 35th floor in Sky Tower building (highest in Romania), we are hiring a Cloud DevOps Engineer.\u003c/p\u003e\n\u003cp\u003eAs a Cloud DevOps Engineer you will:\n– Be curious. You ask \"why\"?, you explore, you’re not afraid to blurt out your crazy idea\n– Code the infrastructure to act as designed\n– Improve the whole life-cycle of services from design, through deployment, operation and refinement\n– Maintain services once they are live by measuring and monitoring availability, latency and overall system health\n– Scale systems sustainably through mechanisms like automation, and evolve systems by pushing for changes that improve reliability and velocity\n– Practice sustainable incident response and blameless postmortems\n– Have an opinion on any/all of the following orchestration tools\n– Be an audiophile – Interested in all things audio including but not limited to: sound quality, streaming technologies and best bands of 21st century\u003c/p\u003e\n\u003cp\u003eWhat you bring to the team:\n– Bachelor Degree in Computer Science, Mathematics and Informatics or equivalent\n– At least 2 years of experience working on large-scale distributed systems\n– Experience running Linux-based production systems\n– Your thinking starts with the desire for high availability\n– Your love for the command line and scripting development\n– Experience with Amazon AWS services (EC2, S3, ELB, …)\n– Experience with or related technologies like Puppet, Ansible, Nagios, Grafana, Prometheus, HAProxy, NGinx, Apache, MySQL/MariaDB, Kubernetes, Kafka, Hadoop\n– CI/CD for both infrastructure and applications\u003c/p\u003e\n\u003cp\u003eOur offer (bonuses, benefits) – what’s in it for you:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCasual \u0026amp; friendly working environment with opportunities to impact the company with your ideas and involvement\u003c/li\u003e\n\u003cli\u003eWe have a start-up culture, product-centric, international/multi-cultural environment in each office and easy going communication style (even with Top Management)\u003c/li\u003e\n\u003cli\u003eTechnology diversity, interesting technical exposure in building the best ad-tech product on the market\u003c/li\u003e\n\u003cli\u003eFlexible working schedule and work-from-home option, within predefined rules\u003c/li\u003e\n\u003cli\u003eIndividual training budget to use as you like for career improvement\u003c/li\u003e\n\u003cli\u003eBonus system, on top of base salary, paid quarterly (for real, not just on paper)\u003c/li\u003e\n\u003cli\u003ePaid days off related to quarterly performance\u003c/li\u003e\n\u003cli\u003eDay off on your birthday (or within that month if it falls on the weekend)\u003c/li\u003e\n\u003cli\u003eSports bonus for activities such as gym, dances, yoga, etc.\u003c/li\u003e\n\u003cli\u003eWe encourage your healthy life-style with company paid enrollment for running or biking events\u003c/li\u003e\n\u003cli\u003eMeal tickets\u003c/li\u003e\n\u003cli\u003eGift cards for special events (e.g.: Easter, 1st of June, 8th of March, Christmas)\u003c/li\u003e\n\u003cli\u003eMedical coverage to keep you healthy\u003c/li\u003e\n\u003cli\u003eParking lots at Sky Tower\u003c/li\u003e\n\u003cli\u003eAdsWizz technical books library – you can propose new technical books to be bought by the company\u003c/li\u003e\n\u003cli\u003eBookster subscription\u003c/li\u003e\n\u003cli\u003eGood hardware devices (new laptops / Mac’s, displays etc.)\u003c/li\u003e\n\u003cli\u003eOffice relaxation areas (ping-pong, foosball etc.)\u003c/li\u003e\n\u003cli\u003eTeam buildings – each team goes on outings to keep that flame alive\u003c/li\u003e\n\u003cli\u003eAnnual Christmas party – the best company party you’ve ever seen\u003c/li\u003e\n\u003cli\u003eFamily events (e.g.: Halloween and Christmas party for employees’ kids)\u003c/li\u003e\n\u003cli\u003eThemed team events nights (casino night, boardgames night, scary movies night, etc.)\u003c/li\u003e\n\u003cli\u003eCatered lunch-time meetings\u003c/li\u003e\n\u003cli\u003eWe have weekly fresh fruit along with coffee and tea to keep that brain in top shape, orange juice \u0026amp; vending machine on premise as well\u003c/li\u003e\n\u003cli\u003eCSR activities (cake auctions, yard sales, blood donation campaigns at our office)\nWanna see how Belgian chocolate goes with technology? Come and join a community of the smartest folks you’ve ever met, that want to aim for the sky and want to use their skills to make a difference!\u003c/li\u003e\n\u003c/ul\u003e\n", - "how_to_apply": "\u003cp\u003e\u003ca href=\"https://www.adswizz.com/our-careers#!/job/4528257002?utm_source=github\u0026amp;utm_medium=smartdreamers\u0026amp;utm_campaign=July_2020_%7C_Cloud_DevOps_Engineer_%7C_Bucharest\"\u003ehttps://www.adswizz.com/our-careers#!/job/4528257002?utm_source=github\u0026amp;utm_medium=smartdreamers\u0026amp;utm_campaign=July_2020_%7C_Cloud_DevOps_Engineer_%7C_Bucharest\u003c/a\u003e\u003c/p\u003e\n", - "company_logo": "https://jobs.github.com/rails/active_storage/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBanFHIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--0903e54cc814013e7ce5b39a629717629e033a4e/Adswizz.png" - }, - { - "id": "72de09f2-5bc6-489f-be90-3d38e505e20a", - "type": "Full Time", - "url": "https://jobs.github.com/positions/72de09f2-5bc6-489f-be90-3d38e505e20a", - "listingDate": "Thu Jul 16 12:01:05 UTC 2020", - "company": "Cool Company", - "company_url": "https://www.adswizz.com/", - "location": "Bucharest", - "title": "Full Stack Developer", - "description": "\u003cp\u003eFor our Internal Apps team in Bucharest, located in Sky Tower building (highest high in Romania), we are hiring a Full-stack Developer, with strong, proven JavaScript skills for building solid UIs. The team supports several services that help AdsWizz operate better regarding the finance team, billing users, and data center operations. In order to support all of these different areas, we need to work closely with our colleagues and partners, building products that allow these different teams to move fast.\nAt AdsWizz, our software suite includes a variety of ad technology capabilities, including dynamic ad insertion, advanced programmatic platforms, ad campaign monitoring tools, and more.\u003c/p\u003e\n\u003cp\u003eAs a Full Stack Developer, you will:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eWork with a new team developing internal applications to support enterprise operations\u003c/li\u003e\n\u003cli\u003ePlay a role in re-imagining productivity by shipping products that serve different aspects within AdsWizz\u003c/li\u003e\n\u003cli\u003eContinual improvement of tech stack and processes\u003c/li\u003e\n\u003cli\u003eIdentify and fix any performance issues\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eYour Job Requirements:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eBachelor Degree in Computer Science, Mathematics and Informatics or equivalent\u003c/li\u003e\n\u003cli\u003eOverall knowledge of the Java ecosystem\u003c/li\u003e\n\u003cli\u003eHands-on experience using Spring Boot\u003c/li\u003e\n\u003cli\u003eExposure to MongoDB preferred\u003c/li\u003e\n\u003cli\u003eCloud experience with AWS preferred\u003c/li\u003e\n\u003cli\u003eMinimum of 2 years in Frontend Development\u003c/li\u003e\n\u003cli\u003eExperience with at least one modern JS framework (Vue, React, Angular)\u003c/li\u003e\n\u003cli\u003eExperience with HTML5, CSS and JavaScript\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eOur offer (bonuses, benefits) - what’s in it for you:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCasual \u0026amp; friendly working environment with opportunities to impact the company with your ideas and involvement\u003c/li\u003e\n\u003cli\u003eWe have a start-up culture, product-centric, international/multi-cultural environment in each office and easy-going communication style (even with Top Management)\u003c/li\u003e\n\u003cli\u003eTechnology diversity, interesting technical exposure in building the best ad-tech product on the market\u003c/li\u003e\n\u003cli\u003eFlexible working schedule and work-from-home option, within predefined rules\u003c/li\u003e\n\u003cli\u003eIndividual trainings budget to use as you like for career improvement\u003c/li\u003e\n\u003cli\u003eBonus system, on top of base salary, paid quarterly (for real, not just on paper)\u003c/li\u003e\n\u003cli\u003ePaid days off related to quarterly performance\u003c/li\u003e\n\u003cli\u003eDay off on your birthday (or within that month if it falls on the weekend)\u003c/li\u003e\n\u003cli\u003eSports bonus for activities such as gym, dances, yoga, etc.\u003c/li\u003e\n\u003cli\u003eWe encourage your healthy lifestyle with company paid enrollment for running or biking events\u003c/li\u003e\n\u003cli\u003eMeal tickets\u003c/li\u003e\n\u003cli\u003eGift cards for special events (e.g.: Easter, 1st of June, 8th of March, Christmas)\u003c/li\u003e\n\u003cli\u003eMedical coverage to keep you healthy\u003c/li\u003e\n\u003cli\u003eParking lots at Sky Tower\u003c/li\u003e\n\u003cli\u003eAdsWizz technical books library – you can propose new technical books to be bought by the company\u003c/li\u003e\n\u003cli\u003eBookster subscription\u003c/li\u003e\n\u003cli\u003eGood hardware devices (new laptops / Mac’s, displays etc.)\u003c/li\u003e\n\u003cli\u003eOffice relaxation areas (ping-pong, foosball etc.)\u003c/li\u003e\n\u003cli\u003eTeam buildings – each team goes on outings to keep that flame alive\u003c/li\u003e\n\u003cli\u003eAnnual Christmas party – the best company party you’ve ever seen\u003c/li\u003e\n\u003cli\u003eFamily events (e.g.: Halloween and Christmas party for employees’ kids)\u003c/li\u003e\n\u003cli\u003eThemed team events nights (casino night, boardgames night, scary movies night, etc.)\u003c/li\u003e\n\u003cli\u003eCatered lunch-time meetings\u003c/li\u003e\n\u003cli\u003eWe have weekly fresh fruit along with coffee and tea to keep that brain in top shape, orange juice \u0026amp; vending machine on premise as well\u003c/li\u003e\n\u003cli\u003eCSR activities (cake auctions, yard sales, blood donation campaigns at our office)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eWanna see how Belgian chocolate goes with technology? Come and join a community of the smartest folks you’ve ever met, that want to aim for the sky and want to use their skills to make a difference!\u003c/p\u003e\n", - "how_to_apply": "\u003cp\u003e\u003ca href=\"https://www.adswizz.com/our-careers#!/job/4655034002?utm_source=github\u0026amp;utm_medium=smartdreamers\u0026amp;utm_campaign=July_2020_%7C_Tech_-_Carusel_%20_Reddit_V2\"\u003ehttps://www.adswizz.com/our-careers#!/job/4655034002?utm_source=github\u0026amp;utm_medium=smartdreamers\u0026amp;utm_campaign=July_2020_%7C_Tech_-_Carusel_%20_Reddit_V2\u003c/a\u003e\u003c/p\u003e\n", - "company_logo": "https://jobs.github.com/rails/active_storage/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBamlHIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--e1179a81b464c0745dbc8425721bc2fd18c91588/Adswizz.png" - }, - { - "id": "cc20d9f2-0102-4785-8253-66093d3ca5c0", - "type": "Full Time", - "url": "https://jobs.github.com/positions/cc20d9f2-0102-4785-8253-66093d3ca5c0", - "listingDate": "Thu Jul 16 02:02:01 UTC 2020", - "company": "Koffie Labs", - "company_url": "https://www.getkoffie.com/", - "location": "NYC/Remote", - "title": "Junior Data Engineer", - "description": "\u003cp\u003eKoffie is an insurance company purpose built for the autonomous vehicle era. We are taking transportation insurance out of the dark ages by using modern technology to deliver instant policies based on advanced safety and autonomous technology. As an InsurTech, Koffie is free from legacy systems and inefficient processes, our AI-driven predictive models deliver a reimagined insurance experience for fleets.\u003c/p\u003e\n\u003cp\u003eWe believe strongly in diversity of thought which comes from different backgrounds and experiences and want to hear from you, regardless of where you live. Koffie is a work from home first company but believes face time every few weeks is essential.\u003c/p\u003e\n\u003cp\u003eOur vision is to align incentives across fleets, technology providers, brokers and the automotive industry. By catalyzing the adoption of safety technology, we positively impact road safety and facilitate a more efficient supply chain. We’re backed by top-tier VCs in the fintech and mobility sectors. If you're ready to work obsessively with us to make insurance better, faster, more efficient and build products for the next 100 years of mobility, we want to hear from you.\u003c/p\u003e\n\u003cp\u003eDescription\nThis is a unique role that offers broad exposure to software engineering and data science. We are eager to find underrepresented candidates who are early in their career and don’t want to choose between engineering or data science.\u003c/p\u003e\n\u003cp\u003eWorking with data science and engineering, you will be deeply enmeshed in the critical nuances of disambiguation, normalization, standardization and other ETL skills. You will also have the opportunity to work in all stages of our software process from researching data sources to developing data pipelines and building business intelligence visualization tools.\u003c/p\u003e\n\u003cp\u003eResponsibilities\u003c/p\u003e\n\u003cp\u003eDesign and build data pipelines\nRun and iterate data science experiments in the cloud and in a production environment\nSupport business intelligence and data science needs via visualization/reporting\u003c/p\u003e\n\u003cp\u003eBackground/Experience\u003c/p\u003e\n\u003cp\u003e-Undergraduate CS degree or equivalent; 2-5 years professional experience\n-Experience with python; the ideal candidate is generally comfortable with web programming, consuming APIs, data wrangling, etc.\n-ETL processes on large open/public (\u0026gt;50 GB) datasets a plus\n-Designing systems that store/query geospatial and time series data\n-Familiarity with python data engineering, data science, and visualization frameworks\n-Good understanding of classification and regression metrics\n-Curiosity for insurance and autonomous technology applied to transportation/trucking\n-Entrepreneurial mindset and comfort with ambiguity\u003c/p\u003e\n\u003cp\u003eBenefits\nFor US employees we offer a competitive salary, stock options, unlimited vacation, 100% employer paid health, vision and dental plans, commuter benefits and discounted fitness classes, generous WFH stipend, personal learning/training (for professional/industry certification) and conference budget. For remote hires outside the US, we are unable to provide employer paid health, vision and dental plans, commuter benefits and discounted fitness classes.\u003c/p\u003e\n\u003cp\u003eWe believe strongly in diversity of thought which comes from different backgrounds and experiences. Covid has helped us transform to a WFH-first company, so periodic multi-day get-togethers are an essential part of growing our team.\u003c/p\u003e\n", - "how_to_apply": "\u003cp\u003e\u003ca href=\"https://apply.workable.com/j/A4566CE638\"\u003ehttps://apply.workable.com/j/A4566CE638\u003c/a\u003e\u003c/p\u003e\n", - "company_logo": "https://jobs.github.com/rails/active_storage/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBaVdHIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--e4bccde8a00566a0961a533bbed67c6026714783/koffie%20logo%20black.jpg" - }, - { - "id": "65ed6c1f-e74e-47ed-a85f-126ef1071a47", - "type": "Full Time", - "url": "https://jobs.github.com/positions/65ed6c1f-e74e-47ed-a85f-126ef1071a47", - "listingDate": "Wed Jul 15 14:35:57 UTC 2020", - "company": "Avans Hogeschool", - "company_url": "http://www.avans.nl", - "location": "Breda", - "title": "Product owner", - "description": "\u003cp\u003eBreda 0,8 - 1,0 fte\u003c/p\u003e\n\u003cp\u003eMet een slim begrotings- en prognoseproces Avans in staat stellen om betere bedrijfsmatige keuzes te maken. Dat is jouw eerste uitdaging. Het budget zo goed mogelijk inzetten voor het beste onderwijs.\u003c/p\u003e\n\u003ch2\u003e\u003cstrong\u003eUitdagend werk\u003c/strong\u003e\u003c/h2\u003e\n\u003cp\u003eWe hebben al heel wat vooronderzoek gedaan. Zo hebben we al een goed systeem om terug te kijken naar onze financiële prestaties in het verleden. Als Product Owner ga jij ons helpen om naar de toekomst te kijken. Met de aankoop, implementatie en (door)ontwikkeling van een state of the art begrotings- en prognosesysteem. Vanuit integraliteit werk je intensief samen met andere collega’s van HR en Management informatie. Voor jou een aantrekkelijke combinatie. Want jij hebt ervaring met het kernonderwerp Finance en je weet wensen van stakeholders te vertalen naar op te leveren verbeterde en gedigitaliseerde bedrijfsvoeringsprocessen. Dat doe je door:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eEen strategische start: je verzamelt ideeën en zet de koers uit binnen een zelfsturend team dat volgens een agile methode samenwerkt. Je gaat nadenken over de inhoud. Wat willen we bereiken en hoe gaan we de prognose tool gebruiken? Je gaat nadenken over het verleden en dit projecteren op de toekomst. We zijn benieuwd naar jouw ideeën.\u003c/li\u003e\n\u003cli\u003eVerbinding: je brengt partijen bij elkaar en weet te overtuigen. Dit doe je in nauwe samenwerking met andere Product Owners, de Programma Manager, betrokken stakeholders (gebruikers van het systeem zoals professionals en directieleden), de scrummaster en specialisten, bijvoorbeeld de technisch specialisten die in het digitale systeem realiseren wat jij met je team hebt bedacht.\u003c/li\u003e\n\u003cli\u003eEen wow effect te creëren bij je stakeholders: in de rol van Product Owner ga je waarde toevoegen omdat jij enerzijds een gedegen bedrijfseconomische achtergrond hebt, maar ook omdat je een commerciële instelling hebt en het oprecht leuk vindt om mensen te verbinden. Je gaat met hen aan tafel en maakt ze enthousiast.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e\u003cstrong\u003eJuiste match\u003c/strong\u003e\u003c/h2\u003e\n\u003cp\u003eJe bent een resultaatgerichte en verbindende Product Owner die goed kan luisteren, analyseren en verkopen. Samen met je stakeholders en Scrum Team ga je voor succes. Door je prettige manier van communiceren zorg je voor transparantie en duidelijkheid van de product backlog en de product roadmap. En dan heb je ook nog:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eEen hbo-diploma, bijvoorbeeld in de richting van economie of IT. Richting is niet het belangrijkste, je hebt in ieder geval een sterke affiniteit met Finance, ICT en innovatie.\u003c/li\u003e\n\u003cli\u003eMinimaal 5 jaar relevante ervaring als bijvoorbeeld Product Owner, Project Manager of Consultant. Door je ervaring weet je een product vision board en roadmap te creëren en weet je hoe je de voortgang bewaakt van backlog items en opleverdata.\u003c/li\u003e\n\u003cli\u003eCommercieel gevoel, waardoor je tijdens implementatie kan zorgen voor draagvlak en je hand niet omdraait voor het verzorgen van specifieke trainingen. Ook kan je goed omgaan met andere meningen van belangrijke stakeholders.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e\u003cstrong\u003eInspirerende omgeving\u003c/strong\u003e\u003c/h2\u003e\n\u003cp\u003eAvans Hogeschool heeft 53 hbo-opleidingen, 31.000 studenten en 2.800 medewerkers. Behoort al jarenlang tot de top 3 van hogescholen van Nederland. En heeft locaties in Breda, ’s-Hertogenbosch, Roosendaal en Tilburg. We leggen de lat hoog. Ook voor onszelf. Je komt terecht in een warme organisatie met oog voor jou als persoon en jouw ontwikkelwensen. In een informele sfeer delen we best practices met elkaar. Je werk is afwisselend, je hebt mogelijkheden om jezelf verder te ontwikkelen en vanuit deze rol verder door te groeien. Jouw directe collega’s werken bij de Diensteenheid Financiën en Studentenadministratie (DFS) van Avans Hogeschool. Zij heten je graag welkom. Alle 70 medewerkers van DFS streven naar herkenbare kwaliteit in alle processen via een continue verbeterdrang. Zo draagt het team bij aan de ambitie van Avans. Onze kernwaarden zijn: ondernemend, respect, transparant en samen.\u003c/p\u003e\n\u003ch2\u003e\u003cstrong\u003eGoede werkgever\u003c/strong\u003e\u003c/h2\u003e\n\u003cp\u003eAvans Hogeschool haalt graag het allerbeste uit mensen. We staan bekend als goede werkgever. Dat zie je terug in onze arbeidsvoorwaarden.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eVeel vrijheid in je baan met de mogelijkheid om vanuit huis te werken.\u003c/li\u003e\n\u003cli\u003eJe ontvangt een maandsalaris in schaal 11: minimaal € 3.658,64 en maximaal € 5.026,85 bruto bij een fulltime aanstelling. Dit is conform cao hbo.\u003c/li\u003e\n\u003cli\u003eOp basis van een fulltime dienstverband heb je ongeveer 50 vakantiedagen.\u003c/li\u003e\n\u003cli\u003eEen eindejaarsuitkering in de vorm van een dertiende maand is standaard.\u003c/li\u003e\n\u003cli\u003eEen mooie pensioenregeling.\u003c/li\u003e\n\u003cli\u003eWij bieden je een aanstelling voor 1 jaar. Bij goed functioneren krijg je na deze periode een vaste aanstelling.\u003c/li\u003e\n\u003cli\u003eWij bieden je een contract als Beleidsadviseur aan. Dit is de officiële naam van de functie.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e\u003cstrong\u003eBewuste keuze\u003c/strong\u003e\u003c/h2\u003e\n\u003cp\u003eJe bent ervan overtuigd dat deze functie bij je past en je hebt zin om aan de slag te gaan? Solliciteer dan direct, maar uiterlijk op donderdag 13 augustus 2020, via de 'Solliciteer' button.. Binnen enkele minuten ontvang je een automatische sollicitatiebevestiging. Wij streven ernaar je binnen 2 weken na de sluitingsdatum te informeren over de status van jouw sollicitatie. Bij vragen kun je contact opnemen met Mark Reijndorp, Program Manager Digitalisering bedrijfsvoering \u003ca href=\"mailto:mcc.reijndorp@avans.nl\"\u003emcc.reijndorp@avans.nl\u003c/a\u003e, 06-20104435 of met Herre Wynia, Adjunct Directeur van de Diensteenheid Financiën en Studentenadministratie, 06–51708371.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://vonq.io/32bAqzJ\"\u003eKlik hier om te solliciteren!\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eWe hebben de vacature zowel intern als extern uitgezet. Na de sluitingsdatum verwijderen wij de vacaturetekst van de website. Aan de inhoud van deze vacature kun je geen rechten ontlenen. Acquisitie naar aanleiding van deze tekst stellen wij niet op prijs.\u003c/p\u003e\n", - "how_to_apply": "\u003cp\u003e\u003ca href=\"https://vonq.io/32bAqzJ\"\u003eKlik hier om te solliciteren!\u003c/a\u003e\u003c/p\u003e\n", - "company_logo": "https://jobs.github.com/rails/active_storage/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBaUtHIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--811635464a644231f58bf5cffb52d475b7e77aae/avans%20hogeschool%20logo.jpeg" - }, - { - "id": "285aa472-990f-418d-b376-e03c27f48d17", - "type": "Full Time", - "url": "https://jobs.github.com/positions/285aa472-990f-418d-b376-e03c27f48d17", - "listingDate": "Wed Jul 15 14:22:21 UTC 2020", - "company": "OrbitalAds", - "company_url": "https://orbitalads.com", - "location": "Madrid (Spain)", - "title": "Quality Assurance Engineer", - "description": "\u003cp\u003eHi there! We’re growing the Engineering Team in our Madrid’s (Spain) office, and you can be a part of that journey as our Quality Assurance Engineer. Are you looking for an adventure?\u003c/p\u003e\n\u003cp\u003eIn OrbitalAds, we are a diverse team of passionate problem-solvers, working hard focused on optimizing the performance of Google Ads campaigns and accounts through the automation of keywords management. We do so through the development of in-house technology that we have packaged into a pretty cool product.\u003c/p\u003e\n\u003cp\u003eAs a QA Engineer, you’ll work closely with our Product, Backend and Frontend Teams. Our mission, as part of a QA Team, is to validate that all aspects of the product and related components are delivered according to agreed quality level to production. We are looking for a person who is capable of solving problems and adapt to different changes, working as a team\u003c/p\u003e\n\u003cp\u003eYou would be joining an agile, flexible and dynamic company. Sound good to you?\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eAs QA, you will:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eEstablish and evolve formal QA processes, ensuring that the team is using industry-accepted best practices.\u003c/li\u003e\n\u003cli\u003eOversee all aspects of quality assurance including establishing metrics, applying industry best practices, and developing new tools and processes to ensure quality goals are met.\u003c/li\u003e\n\u003cli\u003eDevelop and execute test cases, scripts, plans and procedures (manual and automated).\u003c/li\u003e\n\u003cli\u003eAct as the key point of contact for all QA aspects of releases, providing QA services and coordinating QA resources internally and externally.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eWhat skills do I need?\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAn analytical mindset.\u003c/li\u003e\n\u003cli\u003ePassion for new technologies.\u003c/li\u003e\n\u003cli\u003eHave the following soft skills: teamwork, good communication, problem-solving mindset.\u003c/li\u003e\n\u003cli\u003eFluent English.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eWhy you might NOT enjoy this position:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eYou want a highly-structured, predictable day-to-day\u003c/li\u003e\n\u003cli\u003eYou prefer to be managed; you act when asked and let others come up with ideas\u003c/li\u003e\n\u003cli\u003eFast-paced environments make your head spin\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eWhat do we offer you\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eA competitive salary\u003c/li\u003e\n\u003cli\u003eA flexible and fun working environment of startups in the very center of Madrid,\u003c/li\u003e\n\u003cli\u003eAn opportunity to be part of a team growing from the start.\u003c/li\u003e\n\u003cli\u003eAn office where everyone breathes SaaS and looks for scalable solutions.\u003c/li\u003e\n\u003cli\u003e“Best-in-class” colleagues; you’ll work alongside smart people who are hungry to learn and willing to teach you\u003c/li\u003e\n\u003cli\u003eYou’ll have the opportunity to help to create \u0026amp; shape our product and get your hands dirty with proper business-building experience.\u003c/li\u003e\n\u003cli\u003eEvents with the team – regular parties, happy hours, dinners and nerdy hobbies and games\u003c/li\u003e\n\u003cli\u003eHealthy Breakfast in the office to embrace your daily journey with the best energies\u003c/li\u003e\n\u003cli\u003eFlexible compensation like transportation, restaurant tickets and more\u003c/li\u003e\n\u003cli\u003eFun secondary benefits that we would love to hear your opinion on\u003c/li\u003e\n\u003cli\u003eFlexible Schedule to organize your own time under the natural constraints of your department and manager\u003c/li\u003e\n\u003cli\u003eMedical insurance once you pass the six month\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003eAll office related perks will be back after lockdown, currently we are a 100% remote working company. We would like for candidates to be able to at least come once a month to Madrid y all-team weeks.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eHope to hear from you!\u003c/p\u003e\n", - "how_to_apply": "\u003cp\u003eApply to this offer from our Recruitee site:\n\u003ca href=\"https://jobs.orbitalads.com/o/quality-assurance-engineer\"\u003ehttps://jobs.orbitalads.com/o/quality-assurance-engineer\u003c/a\u003e\u003c/p\u003e\n", - "company_logo": "https://jobs.github.com/rails/active_storage/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBaUNHIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--3c0a74d53b536ed4ac2410e4d9393c35ae434c1b/OA_1200X300.jpg" - }, - { - "id": "11cbce13-e6cd-4c79-b904-d292b569b22f", - "type": "Full Time", - "url": "https://jobs.github.com/positions/11cbce13-e6cd-4c79-b904-d292b569b22f", - "listingDate": "Wed Jul 15 12:17:30 UTC 2020", - "company": "OpenPlay", - "company_url": "http:", - "location": "Santa Monica", - "title": "Software Enginee", - "description": "\u003ch2\u003eCompany Description\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eHello, we’re OpenPlay!\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eWe’re looking for a full-stack engineer to work with us on our web-based music distribution application. You’ll work with us to design, develop, and deploy new application features for one of the world’s largest record companies. This is a full-time position that can be local (Los Angeles) or fully remote.\u003c/p\u003e\n\u003ch2\u003eWhat’s an OpenPlay?\u003c/h2\u003e\n\u003cp\u003eWe’re a small software team making distribution and workflow products for some of the world’s largest music companies. We’re big on testing, constant incremental improvement, craftsmanship, and pragmatism, and so far have been able to use those buzzwords to quickly deliver lots of features to keep the music industry running. We strive to make well engineered software that looks great and is friendly to use. We’re collaborative, supportive, enjoy learning, and most of all enthusiastic about building new things and making old things better.\u003c/p\u003e\n\u003ch2\u003eJob Description\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eWhat you’ll be doing:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cstrong\u003eRefining requirements.\u003c/strong\u003e We follow an agile process focused on rapid incremental delivery. You’ll take rough features born from an interesting idea, a customer request, or an overdue refactor (or a bug), and collaborate designing the user experience and technical direction necessary to release the next (or first) version.\u003c/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eProgramming.\u003c/strong\u003e It wouldn’t be an engineering position without some programming. We try to get to this step with minimal planning time so we can see how an idea takes shape in the real world. Our languages of choice are Ruby and Javascript. We tend to practice outside-in development: most features start with a rough end-to-end (or system, or integration, etc.) test, then we attach some UI, give it an endpoint to communicate with, and finally add in the persistence layer. You’ll be responsible for your feature iterations from start to finish, but you’ll have a team to help and design support for visual polish.\u003c/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eDeploying.\u003c/strong\u003e We offload and automate devops as much as possible, but a small part of every feature is still getting it deployed and ensuring it’s working as expected. We deploy features to production a few times per day on a typical day.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eSkills we’re looking for:\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cstrong\u003ePractical experience in full stack web application development.\u003c/strong\u003e At least a few years working on both the server and client side of production web applications. Experience with any client/server development (i.e. mobile) would probably also be pretty applicable. Console game development sounds really cool but probably wouldn’t transfer over as well. TI-86 calculator programming experience wouldn’t be a great fit either.\u003c/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eAcademic knowledge of software development.\u003c/strong\u003e In addition to being able to make something work, you’ll need to be able to research and articulate why it’s a particularly good solution. A computer science degree is one good barometer we’re looking for, but we understand it’s not the only path to understanding engineering principles and isn't required.\u003c/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eA desire to collaborate with others.\u003c/strong\u003e As a team we often discuss new and better ways to approach problems. We do code reviews and we write comments explaining our rationale when code looks smelly. If you enjoy thinking about new solutions to old problems, and can balance that with small, iterative, deliveries, you’ll probably enjoy working with us.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eQualifications\u003c/h2\u003e\n\u003cp\u003eKey technology experience:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cstrong\u003eRuby.\u003c/strong\u003e Experience with ruby would be ideal, but experience with other object-oriented dynamic languages would transfer over pretty well, especially python (you won’t be the only convert). Extensive experience in any programming language might fit as well. If you’re new to Ruby but enjoy object-oriented programming you’ll probably love it.\u003c/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eJavascript.\u003c/strong\u003e Experience with other semi-prototypal web-browser-based scripting languages with a nonsense hodge-podge standard library would probably transfer over too, but happily for the world we’re not sure any exist. In any case, the more experience you have with Javascript the better.\u003c/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eTesting.\u003c/strong\u003e The heart of our workflow is a full suite of end-to-end tests that we rely on to rapidly and safely build and deploy new features and refactor old code. Prior experience with test driven development or behavior driven development would be a big plus.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eMore specific technologies we use:\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eOur server-side code is MVC-structured and built around Sequel (ORM) and Sinatra. If you’re familiar with Rails or similar MVC frameworks you’ll feel at home pretty quickly.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOur core distribution product (OpenPlay Music) is a traditional multi-page application driven by server-side HTML and using Javascript to apply bits of dynamic behavior.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOur project management and workflow tool is a more recent single-page-application built in React and backed by Ruby communicating over JSON.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe enjoy both of them and think they are both appropriate technologies for different types of applications.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWe do things typical of web applications like:\u003c/p\u003e\n\u003cp\u003eº Store data in and query from a relational database (PostgreSQL)\u003c/p\u003e\n\u003cp\u003eº Index data and query it with filtering and full text searching (Elasticsearch)\u003c/p\u003e\n\u003cp\u003eº Handle slow tasks with background processing\u003c/p\u003e\n\u003cp\u003eº Push notifications to clients with WebSockets\u003c/p\u003e\n\u003cp\u003eº Export XML files, PDFs, CSVs, Excel spreadsheets, and other formats that just won’t seem to go away\u003c/p\u003e\n\u003cp\u003eº Communicate with lots of external systems across all manner of APIs\u003c/p\u003e\n\u003cp\u003eº Provide a JSON API for our customers to build on top of\u003c/p\u003e\n\u003cp\u003eº Offload as much devops as possible to Heroku\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eAdditional Information\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eBenefits\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCompetitive compensation\u003c/li\u003e\n\u003cli\u003eMedical, dental, and vision insurance\u003c/li\u003e\n\u003cli\u003eWork life balance: We expect you to generally work 40 hours/week but understand that sometimes it’s summer. We might rarely have a big push where we end up working long hours. The last time this happened was in 2019 for about a week. The time before that was in 2016 for about 3 weeks.\u003c/li\u003e\n\u003cli\u003eFlexible work and vacation schedule: We have found so far that if the work is enjoyable it isn’t necessary to police when people are working. So we try to keep the work enjoyable.\u003c/li\u003e\n\u003cli\u003eFree to work remote: Our process works just as well in person or remote. It can sometimes even feel remote at the office when we’re sitting next to each other talking on Slack with our headphones in.\u003c/li\u003e\n\u003cli\u003eCompany Minecraft server with lots of odd elevated stone platforms.\u003c/li\u003e\n\u003cli\u003eOffice by the beach with a small-but-growing collection of vinyl figurines.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAll your information will be kept confidential according to EEO guidelines.\u003c/p\u003e\n\u003ch2\u003eInterested?\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://vonq.io/38Xr2kJ\"\u003eClick here to apply!\u003c/a\u003e\u003c/p\u003e\n", - "how_to_apply": "\u003cp\u003e\u003ca href=\"https://vonq.io/38Xr2kJ\"\u003eClick here to apply!\u003c/a\u003e\u003c/p\u003e\n", - "company_logo": "https://jobs.github.com/rails/active_storage/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBaGlHIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--768d7d0ec6983dfb25b4a5b7b4cfada6f9846a70/Openplay.jpeg" - } -] diff --git a/cypress/fixtures/signup.json b/cypress/fixtures/signup.json deleted file mode 100644 index 5607b94..0000000 --- a/cypress/fixtures/signup.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "_id": "5f341627b640c36fd616c300", - "email": "bobtest@email.com", - "name": "Bob Test", - "createdAt": "2020-07-20T21:09:00.323Z", - "updatedAt": "2020-07-20T21:12:01.627Z", - "__v": 1 -} diff --git a/cypress/integration/applicationError.spec.js b/cypress/integration/applicationError.spec.js index 2dea7f7..c4eddce 100644 --- a/cypress/integration/applicationError.spec.js +++ b/cypress/integration/applicationError.spec.js @@ -24,14 +24,12 @@ context("Application Error", () => { delay: 1000, }); cy.visit("http://localhost:3000"); - cy.wait(500); }); it("Should display ErrorFallback correctly when an error occurs", () => { // * Create an error with stubbed response cy.get("#search").type("react"); cy.get("#search-submit").click(); - cy.wait(1000); cy.get("h1").should("have.text", "Technical Difficulties"); cy.get("p").should( @@ -45,19 +43,15 @@ context("Application Error", () => { // * Create an error with stubbed response cy.get("#search").type("react"); cy.get("#search-submit").click(); - cy.wait(1000); cy.get("#try-again").click(); - cy.wait(500); cy.get("#search").should("be.visible"); }); it("Should push app to '/' when 'Try again' button is clicked", () => { cy.get("#\\37").click({ force: true }); - cy.wait(1000); cy.get("#try-again").click(); - cy.wait(500); cy.get("#search").should("be.visible"); }); }); diff --git a/cypress/integration/authentication.spec.js b/cypress/integration/authentication.spec.js index 7c87191..f68d9d3 100644 --- a/cypress/integration/authentication.spec.js +++ b/cypress/integration/authentication.spec.js @@ -4,13 +4,11 @@ context("Authentication", () => { beforeEach(() => { // * Login cy.visit("http://localhost:3000"); - cy.wait(1000); cy.get("#nav-login").click(); cy.get("h1").should("have.text", "Login"); cy.get("#email").type("bobtest@email.com"); cy.get("#password").type("Red123456!!!"); cy.get("#log-in").click(); - cy.wait(1000); cy.get("#nav-login").should("not.exist"); cy.get("#search").should("be.visible"); }); @@ -30,8 +28,6 @@ context("Authentication", () => { cy.get("#email").type("bobtest2@email.com"); cy.get("#edit-confirm").click(); - cy.wait(500); - // * Assert Redirect cy.get("#notification").should("have.text", "Please authenticate."); cy.url().should("eq", "http://localhost:3000/login"); @@ -55,8 +51,6 @@ context("Authentication", () => { ); cy.get("#delete-profile-confirm").click(); - cy.wait(500); - // * Assert Redirect cy.get("#notification").should("have.text", "Please authenticate."); cy.url().should("eq", "http://localhost:3000/login"); @@ -79,8 +73,6 @@ context("Authentication", () => { cy.get("#confirm-new-password").type("Blue123456!!!"); cy.get("#reset").click(); - cy.wait(500); - // * Assert Redirect cy.get("#notification").should("have.text", "Please authenticate."); cy.url().should("eq", "http://localhost:3000/login"); @@ -98,8 +90,6 @@ context("Authentication", () => { cy.get("#settings").click(); cy.get("#log-out").click(); - cy.wait(500); - // * Assert Log Out cy.get("#nav-login").should("exist"); cy.get("#search").should("be.visible"); @@ -116,42 +106,71 @@ context("Authentication", () => { cy.get("#settings").click(); cy.get("#log-out-all").click(); - cy.wait(500); - // * Assert Log Out cy.get("#nav-login").should("exist"); cy.get("#search").should("be.visible"); }); - // ! Can't implement this until you create a Test Database with Test Jobs - it("Should redirect to '/login' when user attempts to show a hidden job on their profile after becoming unauthenticated", () => {}); + it("Should redirect to '/login' when user attempts to show a hidden job on their profile after becoming unauthenticated", () => { + cy.get("#hide-job-7").click(); + + cy.get("#nav-profile").click(); + cy.get("#view-hidden-jobs").click(); + + // * Remove authentication cookie + cy.clearCookie("ghjobs"); + + cy.get("#show-job-7").click(); - // ! Can't implement this until you create a Test Database with Test Jobs - it("Should redirect to '/login' when user attempts to hide a saved job on their profile after becoming unauthenticated", () => {}); + // * Assert Redirect + cy.get("#notification").should("have.text", "Please authenticate."); + cy.url().should("eq", "http://localhost:3000/login"); + cy.get("h1").should("have.text", "Login"); + + // * Cleanup + cy.get("#email").type("bobtest@email.com"); + cy.get("#password").type("Red123456!!!"); + cy.get("#log-in").click(); + cy.get("#nav-profile").click(); + cy.get("#view-hidden-jobs").click(); + cy.get("#show-job-7").click(); + }); + + it("Should redirect to '/login' when user attempts to hide a saved job on their profile after becoming unauthenticated", () => { + cy.get("#save-job-7").click(); + + cy.get("#nav-profile").click(); + cy.get("#view-saved-jobs").click(); + + // * Remove authentication cookie + cy.clearCookie("ghjobs"); + + cy.get("#remove-job-7").click(); + + // * Assert Redirect + cy.get("#notification").should("have.text", "Please authenticate."); + cy.url().should("eq", "http://localhost:3000/login"); + cy.get("h1").should("have.text", "Login"); + + // * Cleanup + cy.get("#email").type("bobtest@email.com"); + cy.get("#password").type("Red123456!!!"); + cy.get("#log-in").click(); + cy.get("#nav-profile").click(); + cy.get("#view-saved-jobs").click(); + cy.get("#remove-job-7").click(); + }); }); context("Authentication - Search Page", () => { beforeEach(() => { - cy.fixture("jobs50").then((jobsJson) => { - cy.server(); - cy.route({ - method: "POST", - url: "/jobs", - status: 200, - response: jobsJson, - delay: 1000, - }); - }); - // * Login cy.visit("http://localhost:3000"); - cy.wait(1000); cy.get("#nav-login").click(); cy.get("h1").should("have.text", "Login"); cy.get("#email").type("bobtest@email.com"); cy.get("#password").type("Red123456!!!"); cy.get("#log-in").click(); - cy.wait(1000); cy.get("#nav-login").should("not.exist"); cy.get("#search").should("be.visible"); }); @@ -161,7 +180,7 @@ context("Authentication - Search Page", () => { cy.clearCookie("ghjobs"); // * Click Save Job - cy.get("#save-job-f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").click(); + cy.get("#save-job-7").click(); // * Assert Redirect cy.get("#notification").should("have.text", "Please authenticate."); @@ -174,7 +193,7 @@ context("Authentication - Search Page", () => { cy.clearCookie("ghjobs"); // * Click Save Job - cy.get("#hide-job-f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").click(); + cy.get("#hide-job-7").click(); // * Assert Redirect cy.get("#notification").should("have.text", "Please authenticate."); @@ -185,47 +204,25 @@ context("Authentication - Search Page", () => { context("Authentication - Details Page", () => { beforeEach(() => { - cy.fixture("jobs50").then((jobsJson) => { - cy.fixture("jobDetails").then((jobDetailsJson) => { - cy.server(); - cy.route({ - method: "POST", - url: "/jobs", - status: 200, - response: jobsJson, - delay: 1000, - }); - cy.route({ - method: "GET", - url: "/jobs/f1884b46-ecb4-473c-81f5-08d9bf2ab3bb", - status: 200, - response: jobDetailsJson, - delay: 1000, - }); - }); - }); - // * Login cy.visit("http://localhost:3000"); - cy.wait(1000); cy.get("#nav-login").click(); cy.get("h1").should("have.text", "Login"); cy.get("#email").type("bobtest@email.com"); cy.get("#password").type("Red123456!!!"); cy.get("#log-in").click(); - cy.wait(1000); cy.get("#nav-login").should("not.exist"); cy.get("#search").should("be.visible"); }); it("Should redirect to '/login' when user attempts to save a job after becoming unauthenticated", () => { - cy.get("#f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").click({ force: true }); + cy.get("#\\37").click({ force: true }); // * Remove authentication cookie cy.clearCookie("ghjobs"); // * Click Save Job - cy.get("#save-job-f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").click(); + cy.get("#save-job-7").click(); // * Assert Redirect cy.get("#notification").should("have.text", "Please authenticate."); @@ -234,13 +231,13 @@ context("Authentication - Details Page", () => { }); it("Should redirect to '/login' when user attempts to hide a job after becoming unauthenticated", () => { - cy.get("#f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").click({ force: true }); + cy.get("#\\37").click({ force: true }); // * Remove authentication cookie cy.clearCookie("ghjobs"); // * Click Save Job - cy.get("#hide-job-f1884b46-ecb4-473c-81f5-08d9bf2ab3bb").click(); + cy.get("#hide-job-7").click(); // * Assert Redirect cy.get("#notification").should("have.text", "Please authenticate."); diff --git a/cypress/integration/details.spec.js b/cypress/integration/details.spec.js index 4cfb7aa..145126f 100644 --- a/cypress/integration/details.spec.js +++ b/cypress/integration/details.spec.js @@ -3,7 +3,6 @@ context("Details", () => { beforeEach(() => { cy.visit("http://localhost:3000"); - cy.wait(500); cy.get("#\\37").click({ force: true }); }); diff --git a/cypress/integration/directPageAccess.spec.js b/cypress/integration/directPageAccess.spec.js index 17a84b9..65f0aec 100644 --- a/cypress/integration/directPageAccess.spec.js +++ b/cypress/integration/directPageAccess.spec.js @@ -3,22 +3,16 @@ context("Direct Page Access", () => { it("Should be able to access '/login/ directly", () => { cy.visit("http://localhost:3000/login"); - cy.wait(500); - cy.get("h1").should("have.text", "Login"); }); it("Should be able to access '/signup/ directly", () => { cy.visit("http://localhost:3000/signup"); - cy.wait(500); - cy.get("h1").should("have.text", "Create Account"); }); it("Should be able to access '/jobDetails/:id' directly", () => { cy.visit("http://localhost:3000/jobDetails/7"); - cy.wait(500); - cy.get("h2").should("have.text", "Software Engineer"); }); }); diff --git a/cypress/integration/hiddenJobs.spec.js b/cypress/integration/hiddenJobs.spec.js index 923132d..b0dd813 100644 --- a/cypress/integration/hiddenJobs.spec.js +++ b/cypress/integration/hiddenJobs.spec.js @@ -2,24 +2,12 @@ context("Hidden Jobs", () => { beforeEach(() => { - cy.fixture("hiddenDetails").then((hiddenDetailsJson) => { - cy.server(); - // cy.route({ - // method: "GET", - // url: "/user/hiddenJobsDetails", - // status: 200, - // response: hiddenDetailsJson, - // delay: 1000, - // }); - }); cy.visit("http://localhost:3000"); - cy.wait(500); cy.get("#nav-login").click(); cy.get("h1").should("have.text", "Login"); cy.get("#email").type("bobtest@email.com"); cy.get("#password").type("Red123456!!!"); cy.get("#log-in").click(); - cy.wait(500); cy.get("#nav-login").should("not.exist"); cy.get("#search").should("be.visible"); @@ -206,7 +194,6 @@ context("Hidden Jobs", () => { cy.get("#email").type("bobtest@email.com"); cy.get("#password").type("Red123456!!!"); cy.get("#log-in").click(); - cy.wait(500); cy.get("#\\37").should("not.exist"); @@ -257,13 +244,11 @@ context("Hidden Jobs - No Results", () => { }); }); cy.visit("http://localhost:3000"); - cy.wait(500); cy.get("#nav-login").click(); cy.get("h1").should("have.text", "Login"); cy.get("#email").type("bobtest@email.com"); cy.get("#password").type("Red123456!!!"); cy.get("#log-in").click(); - cy.wait(500); cy.get("#nav-login").should("not.exist"); cy.get("#search").should("be.visible"); diff --git a/cypress/integration/login.spec.js b/cypress/integration/login.spec.js index 632be94..56a5cc3 100644 --- a/cypress/integration/login.spec.js +++ b/cypress/integration/login.spec.js @@ -3,7 +3,6 @@ context("Login - Success", () => { beforeEach(() => { cy.visit("http://localhost:3000"); - cy.wait(500); cy.get("#nav-login").click(); cy.get("h1").should("have.text", "Login"); }); @@ -12,7 +11,6 @@ context("Login - Success", () => { cy.get("#email").type("bobtest@email.com"); cy.get("#password").type("Red123456!!!"); cy.get("#log-in").click(); - cy.wait(500); cy.get("#nav-login").should("not.exist"); cy.get("#search").should("be.visible"); @@ -27,7 +25,6 @@ context("Login - Success", () => { context("Login - Error", () => { beforeEach(() => { cy.visit("http://localhost:3000"); - cy.wait(500); cy.get("#nav-login").click(); cy.get("h1").should("have.text", "Login"); }); @@ -36,7 +33,6 @@ context("Login - Error", () => { cy.get("#email").type("bobtest@email.com"); cy.get("#password").type("Blue123456!!!"); cy.get("#log-in").click(); - cy.wait(500); cy.get("#notification").should("have.text", "Invalid credentials."); }); @@ -44,7 +40,6 @@ context("Login - Error", () => { cy.get("#email").type("fake@email.com"); cy.get("#password").type("Red123456!!!"); cy.get("#log-in").click(); - cy.wait(500); cy.get("#notification").should( "have.text", "We couldn't find a user with that email address. Please create an account, or provide another email address." diff --git a/cypress/integration/notification.spec.js b/cypress/integration/notification.spec.js index ec4cc7d..d3956f1 100644 --- a/cypress/integration/notification.spec.js +++ b/cypress/integration/notification.spec.js @@ -3,7 +3,6 @@ context("Notification", () => { beforeEach(() => { cy.visit("http://localhost:3000"); - cy.wait(500); }); it("Should reset the notification on initial load", () => { @@ -12,7 +11,6 @@ context("Notification", () => { cy.get("#email").type("bobtest@email.com"); cy.get("#password").type("Red123456!!!"); cy.get("#log-in").click(); - cy.wait(500); cy.get("#nav-login").should("not.exist"); cy.get("#search").should("be.visible"); cy.get("#nav-profile").click(); @@ -21,8 +19,6 @@ context("Notification", () => { cy.get("#name").type("Cool Bob"); cy.get("#edit-confirm").click(); - cy.wait(500); - cy.get("#notification").should( "have.text", "Profile information updated successfully." @@ -38,7 +34,6 @@ context("Notification", () => { cy.get("#name").clear(); cy.get("#name").type("Bob Test"); cy.get("#edit-confirm").click(); - cy.wait(500); cy.get("#name").should("have.value", "Bob Test"); cy.get("#email").should("have.value", "bobtest@email.com"); }); @@ -49,7 +44,6 @@ context("Notification", () => { cy.get("#email").type("bobtest@email.com"); cy.get("#password").type("Red123456!!!"); cy.get("#log-in").click(); - cy.wait(500); cy.get("#nav-login").should("not.exist"); cy.get("#search").should("be.visible"); cy.get("#nav-profile").click(); @@ -58,8 +52,6 @@ context("Notification", () => { cy.get("#name").type("Cool Bob"); cy.get("#edit-confirm").click(); - cy.wait(500); - cy.get("#notification").should( "have.text", "Profile information updated successfully." @@ -72,7 +64,6 @@ context("Notification", () => { cy.get("#name").clear(); cy.get("#name").type("Bob Test"); cy.get("#edit-confirm").click(); - cy.wait(500); cy.get("#name").should("have.value", "Bob Test"); cy.get("#email").should("have.value", "bobtest@email.com"); }); diff --git a/cypress/integration/optionsPanel.spec.js b/cypress/integration/optionsPanel.spec.js index 05f7373..a1cc4c7 100644 --- a/cypress/integration/optionsPanel.spec.js +++ b/cypress/integration/optionsPanel.spec.js @@ -19,7 +19,6 @@ context("Options Panel", () => { cy.get("#location-search").should("have.value", ""); cy.get("#location-search").type("Los Angeles"); cy.get("#search-submit").click(); - cy.wait(1000); cy.get("#location-search").should("have.value", "Los Angeles"); }); @@ -28,7 +27,6 @@ context("Options Panel", () => { cy.get(":nth-child(4) > [data-cy=checkmark]").click(); cy.get("#location-1").should("be.checked"); cy.get("#search-submit").click(); - cy.wait(1000); cy.get("#location-1").should("be.checked"); }); @@ -36,13 +34,11 @@ context("Options Panel", () => { cy.get("#search").type("developer"); cy.get("#search-submit").click(); - cy.wait(1000); cy.get("#notification").should("have.text", "Search returned 30 results."); cy.get(":nth-child(1) > [data-cy=checkmark]").click(); cy.get("#search-submit").click(); - cy.wait(1000); cy.get("#notification").should("have.text", "Search returned 17 results."); }); @@ -50,20 +46,17 @@ context("Options Panel", () => { cy.get("#search").type("developer"); cy.get("#search-submit").click(); - cy.wait(1000); cy.get("#notification").should("have.text", "Search returned 30 results."); cy.get(":nth-child(2) > [data-cy=checkmark]").click(); cy.get("#search-submit").click(); - cy.wait(1000); cy.get("#notification").should("have.text", "Search returned 13 results."); }); it("Should be able to search within the OptionsPanel", () => { cy.get("#location-search").type("Los Angeles"); cy.get("#options-panel-search").click(); - cy.wait(1000); cy.get("#notification").should("have.text", "Search returned 5 results."); }); diff --git a/cypress/integration/pagination.spec.js b/cypress/integration/pagination.spec.js index fb1c734..0f67858 100644 --- a/cypress/integration/pagination.spec.js +++ b/cypress/integration/pagination.spec.js @@ -13,7 +13,6 @@ context("Pagination", () => { }); }); cy.visit("http://localhost:3000"); - cy.wait(1500); }); it("Should render initial component correctly", () => { @@ -213,7 +212,8 @@ context("Pagination", () => { cy.server(); cy.route({ method: "GET", - url: "/jobs/search?userId=&full_time=false&contract=false&description=&location1=Chicago", + url: + "/jobs/search?userId=&full_time=false&contract=false&description=&location1=Chicago", status: 200, response: jobsJson, }); @@ -266,7 +266,6 @@ context("Pagination - 1 Page", () => { }); }); cy.visit("http://localhost:3000"); - cy.wait(1500); }); it("Should display pagination correctly, when 5 jobs exist", () => { @@ -304,7 +303,6 @@ context("Pagination - 2 Pages", () => { }); }); cy.visit("http://localhost:3000"); - cy.wait(1500); }); it("Should display pagination correctly, when 10 jobs exist", () => { @@ -342,7 +340,6 @@ context("Pagination - 3 Pages", () => { }); }); cy.visit("http://localhost:3000"); - cy.wait(1500); }); it("Should display pagination correctly, when 15 jobs exist", () => { @@ -382,7 +379,6 @@ context("Pagination - 4 Pages", () => { }); }); cy.visit("http://localhost:3000"); - cy.wait(1500); }); it("Should display pagination correctly, when 20 jobs exist", () => { diff --git a/cypress/integration/profile.spec.js b/cypress/integration/profile.spec.js index 123a90d..15be447 100644 --- a/cypress/integration/profile.spec.js +++ b/cypress/integration/profile.spec.js @@ -7,7 +7,6 @@ context("Profile", () => { cy.get("#email").type("bobtest@email.com"); cy.get("#password").type("Red123456!!!"); cy.get("#log-in").click(); - cy.wait(500); cy.get("#nav-login").should("not.exist"); cy.get("#nav-profile").should("be.visible"); @@ -29,8 +28,6 @@ context("Profile", () => { cy.get("#email").type("bobtest2@email.com"); cy.get("#edit-confirm").click(); - cy.wait(1500); - cy.get("h2").should("have.text", "Hello, Cool"); cy.get("#notification").should( "have.text", @@ -44,7 +41,6 @@ context("Profile", () => { cy.get("#email").clear(); cy.get("#email").type("bobtest@email.com"); cy.get("#edit-confirm").click(); - cy.wait(500); cy.get("h2").should("have.text", "Hello, Bob"); cy.get("#name").should("have.value", "Bob Test"); cy.get("#email").should("have.value", "bobtest@email.com"); @@ -87,8 +83,6 @@ context("Profile", () => { cy.get("#confirm-new-password").type("Blue123456!!!"); cy.get("#reset").click(); - cy.wait(500); - cy.get("h2").should("have.text", "Hello, Bob"); cy.get("#notification").should("have.text", "Password reset successfully."); @@ -130,8 +124,6 @@ context("Profile", () => { cy.get("#confirm-new-password").type("Red123456!!!"); cy.get("#reset").click(); - cy.wait(500); - cy.get("#modal-title").should("have.text", "Reset Password"); cy.get("#notification").should("have.text", "Invalid credentials."); }); @@ -145,8 +137,6 @@ context("Profile", () => { cy.get("#confirm-new-password").type("Yellow123456!!!"); cy.get("#reset").click(); - cy.wait(500); - cy.get("#modal-title").should("have.text", "Reset Password"); cy.get("#notification").should("have.text", "Passwords do not match."); }); @@ -168,7 +158,6 @@ context("Profile", () => { it("Should be able to delete a user profile", () => { cy.get("#settings").click(); cy.get("#log-out").click(); - cy.wait(500); cy.get("#nav-login").should("exist"); cy.get("#search").should("be.visible"); cy.get("#nav-login").click(); @@ -181,7 +170,6 @@ context("Profile", () => { cy.get("#password").type("Red123456!!!"); cy.get("#confirm-password").type("Red123456!!!"); cy.get("#signup").click(); - cy.wait(500); cy.get("#nav-login").should("not.exist"); cy.get("#search").should("be.visible"); cy.get("#nav-profile").click(); @@ -195,7 +183,6 @@ context("Profile", () => { "Are you sure you would like to delete your profile? This can not be reversed." ); cy.get("#delete-profile-confirm").click(); - cy.wait(500); cy.get("#nav-login").should("exist"); cy.get("#search").should("be.visible"); }); @@ -203,7 +190,6 @@ context("Profile", () => { it("Should be able to cancel deleting a user profile", () => { cy.get("#settings").click(); cy.get("#log-out").click(); - cy.wait(500); cy.get("#nav-login").should("exist"); cy.get("#search").should("be.visible"); cy.get("#nav-login").click(); @@ -216,7 +202,6 @@ context("Profile", () => { cy.get("#password").type("Red123456!!!"); cy.get("#confirm-password").type("Red123456!!!"); cy.get("#signup").click(); - cy.wait(500); cy.get("#nav-login").should("not.exist"); cy.get("#search").should("be.visible"); cy.get("#nav-profile").click(); @@ -245,7 +230,6 @@ context("Profile", () => { "Are you sure you would like to delete your profile? This can not be reversed." ); cy.get("#delete-profile-confirm").click(); - cy.wait(500); cy.get("#nav-login").should("exist"); cy.get("#search").should("be.visible"); }); diff --git a/cypress/integration/savedJobs.spec.js b/cypress/integration/savedJobs.spec.js index 020a8f5..cb1c9be 100644 --- a/cypress/integration/savedJobs.spec.js +++ b/cypress/integration/savedJobs.spec.js @@ -3,13 +3,11 @@ context("Saved Jobs", () => { beforeEach(() => { cy.visit("http://localhost:3000"); - cy.wait(500); cy.get("#nav-login").click(); cy.get("h1").should("have.text", "Login"); cy.get("#email").type("bobtest@email.com"); cy.get("#password").type("Red123456!!!"); cy.get("#log-in").click(); - cy.wait(500); cy.get("#nav-login").should("not.exist"); cy.get("#search").should("be.visible"); @@ -112,13 +110,11 @@ context("Saved Jobs", () => { context("Saved Jobs - No Results", () => { beforeEach(() => { cy.visit("http://localhost:3000"); - cy.wait(500); cy.get("#nav-login").click(); cy.get("h1").should("have.text", "Login"); cy.get("#email").type("bobtest@email.com"); cy.get("#password").type("Red123456!!!"); cy.get("#log-in").click(); - cy.wait(500); cy.get("#nav-login").should("not.exist"); cy.get("#search").should("be.visible"); diff --git a/cypress/integration/search.spec.js b/cypress/integration/search.spec.js index 485889b..c2e08dd 100644 --- a/cypress/integration/search.spec.js +++ b/cypress/integration/search.spec.js @@ -2,30 +2,13 @@ context("Search", () => { beforeEach(() => { - cy.fixture("jobsSearch1").then((searchJson) => { - cy.server(); - cy.route({ - method: "GET", - url: - "/jobs/search?userId=&full_time=false&contract=false&description=developer", - status: 200, - response: searchJson, - delay: 1000, - }); - }); cy.visit("http://localhost:3000"); }); it("Should search correctly", () => { - cy.get('[data-cy="job-container"]').then(($jobs) => { - assert.equal($jobs.length, 5); - }); cy.get("#search").type("developer"); cy.get("#search-submit").click(); - cy.wait(1000); - cy.get('[data-cy="job-container"]').then(($jobs) => { - assert.equal($jobs.length, 5); - }); + cy.get("#notification").should("have.text", "Search returned 30 results."); }); it("Should retain search value on reload", () => { @@ -37,6 +20,15 @@ context("Search", () => { }); it("Should be able to submit form with enter key", () => { + cy.server(); + cy.route({ + method: "GET", + url: + "/jobs/search?userId=&full_time=false&contract=false&description=developer", + status: 200, + response: [], + delay: 1000, + }); cy.get('[data-cy="orbit-container"]').should("not.be.visible"); cy.get("#search").type("developer"); cy.get("#search").type("{enter}"); diff --git a/cypress/integration/signup.spec.js b/cypress/integration/signup.spec.js index 067af26..13cfaf9 100644 --- a/cypress/integration/signup.spec.js +++ b/cypress/integration/signup.spec.js @@ -3,7 +3,6 @@ context("Signup - Success", () => { beforeEach(() => { cy.visit("http://localhost:3000"); - cy.wait(500); cy.get("#nav-login").click(); cy.get("h1").should("have.text", "Login"); cy.get("#create-an-account").click(); @@ -17,7 +16,6 @@ context("Signup - Success", () => { cy.get("#password").type("Red123456!!!"); cy.get("#confirm-password").type("Red123456!!!"); cy.get("#signup").click(); - cy.wait(500); cy.get("#nav-login").should("not.exist"); cy.get("#search").should("be.visible"); @@ -38,7 +36,6 @@ context("Signup - Success", () => { context("Signup - Error", () => { beforeEach(() => { cy.visit("http://localhost:3000"); - cy.wait(500); cy.get("#nav-login").click(); cy.get("h1").should("have.text", "Login"); cy.get("#create-an-account").click(); @@ -52,7 +49,6 @@ context("Signup - Error", () => { cy.get("#password").type("Red123456!!!"); cy.get("#confirm-password").type("Red123456!!!"); cy.get("#signup").click(); - cy.wait(500); cy.get("#notification").should( "have.text", diff --git a/src/server/controllers/job.ts b/src/server/controllers/job.ts index adec31f..f1401d9 100644 --- a/src/server/controllers/job.ts +++ b/src/server/controllers/job.ts @@ -69,7 +69,7 @@ class JobController { end: endOfToday(), }); - if (!isWithinToday) { + if (!isWithinToday && process.env.NODE_ENV !== "test") { // * Jobs are stale. Get new jobs. const rehydration2Result = await rehydrateJobsDB(); From a029307db0f298de4a4b9fec84655b879d82cc22 Mon Sep 17 00:00:00 2001 From: alexlee-dev Date: Sat, 22 Aug 2020 17:30:52 -0700 Subject: [PATCH 12/17] =?UTF-8?q?=F0=9F=90=9B=20Broken=20SearchInput=20Sty?= =?UTF-8?q?le=20#81=20-=20Add=20Browser-Sync?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 1122 +++++++++++++++++++++++++++++++++++++++++++-- package.json | 1 + src/server/app.ts | 4 + 3 files changed, 1086 insertions(+), 41 deletions(-) diff --git a/package-lock.json b/package-lock.json index 64d0eb3..26c79c2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1209,6 +1209,12 @@ "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", "dev": true }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "dev": true + }, "ajv": { "version": "6.12.3", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", @@ -1276,7 +1282,6 @@ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", "dev": true, - "optional": true, "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -1369,6 +1374,12 @@ "function-bind": "^1.1.1" } }, + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", + "dev": true + }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", @@ -1454,6 +1465,12 @@ "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", "dev": true }, + "async-each-series": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", + "integrity": "sha1-dhfBkXQB/Yykooqtzj266Yr+tDI=", + "dev": true + }, "async-limiter": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", @@ -1514,6 +1531,12 @@ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "dev": true + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -1575,12 +1598,24 @@ } } }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "dev": true + }, "base64-js": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", "dev": true }, + "base64id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "dev": true + }, "basic-auth": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", @@ -1609,6 +1644,15 @@ "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=" }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "dev": true, + "requires": { + "callsite": "1.0.0" + } + }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -1619,8 +1663,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", - "dev": true, - "optional": true + "dev": true }, "bindings": { "version": "1.5.0", @@ -1641,6 +1684,12 @@ "safe-buffer": "^5.1.1" } }, + "blob": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", + "dev": true + }, "blob-util": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", @@ -1738,6 +1787,202 @@ "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", "dev": true }, + "browser-sync": { + "version": "2.26.12", + "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.26.12.tgz", + "integrity": "sha512-1GjAe+EpZQJgtKhWsxklEjpaMV0DrRylpHRvZWgOphDQt+bfLZjfynl/j1WjSFIx8ozj9j78g6Yk4TqD3gKaMA==", + "dev": true, + "requires": { + "browser-sync-client": "^2.26.12", + "browser-sync-ui": "^2.26.12", + "bs-recipes": "1.3.4", + "bs-snippet-injector": "^2.0.1", + "chokidar": "^3.4.1", + "connect": "3.6.6", + "connect-history-api-fallback": "^1", + "dev-ip": "^1.0.1", + "easy-extender": "^2.3.4", + "eazy-logger": "^3", + "etag": "^1.8.1", + "fresh": "^0.5.2", + "fs-extra": "3.0.1", + "http-proxy": "^1.18.1", + "immutable": "^3", + "localtunnel": "^2.0.0", + "micromatch": "^4.0.2", + "opn": "5.3.0", + "portscanner": "2.1.1", + "qs": "6.2.3", + "raw-body": "^2.3.2", + "resp-modifier": "6.0.2", + "rx": "4.1.0", + "send": "0.16.2", + "serve-index": "1.9.1", + "serve-static": "1.13.2", + "server-destroy": "1.0.1", + "socket.io": "2.1.1", + "ua-parser-js": "^0.7.18", + "yargs": "^15.4.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "fs-extra": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", + "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^3.0.0", + "universalify": "^0.1.0" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "jsonfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", + "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true + }, + "opn": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", + "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "qs": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz", + "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=", + "dev": true + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + } + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + } + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + } + } + }, + "browser-sync-client": { + "version": "2.26.12", + "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.26.12.tgz", + "integrity": "sha512-bEBDRkufKxrIfjOsIB1FN9itUEXr2oLtz1AySgSSr80K2AWzmtoYnxtVASx/i40qFrSdeI31pNvdCjHivihLVA==", + "dev": true, + "requires": { + "etag": "1.8.1", + "fresh": "0.5.2", + "mitt": "^1.1.3", + "rxjs": "^5.5.6" + }, + "dependencies": { + "rxjs": { + "version": "5.5.12", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "dev": true, + "requires": { + "symbol-observable": "1.0.1" + } + }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", + "dev": true + } + } + }, + "browser-sync-ui": { + "version": "2.26.12", + "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.26.12.tgz", + "integrity": "sha512-PkAJNf/TfCFTCkQUfXplR2Kp/+/lbCWFO9lrgLZsmxIhvMLx2pYZFBbTBIaem8qjXhld9ZcESUC8EdU5VWFJgQ==", + "dev": true, + "requires": { + "async-each-series": "0.1.1", + "connect-history-api-fallback": "^1", + "immutable": "^3", + "server-destroy": "1.0.1", + "socket.io-client": "^2.0.4", + "stream-throttle": "^0.1.3" + } + }, "browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", @@ -1844,6 +2089,18 @@ "pako": "~1.0.5" } }, + "bs-recipes": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz", + "integrity": "sha1-DS1NSKcYyMBEdp/cT4lZLci2lYU=", + "dev": true + }, + "bs-snippet-injector": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bs-snippet-injector/-/bs-snippet-injector-2.0.1.tgz", + "integrity": "sha1-YbU5PxH1JVntEgaTEANDtu2wTdU=", + "dev": true + }, "bson": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.4.tgz", @@ -1972,6 +2229,12 @@ "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", "dev": true }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "dev": true + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -2062,7 +2325,6 @@ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", "dev": true, - "optional": true, "requires": { "anymatch": "~3.1.1", "braces": "~3.0.2", @@ -2301,12 +2563,24 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "dev": true + }, "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 }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "dev": true + }, "compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -2366,6 +2640,50 @@ "typedarray": "^0.0.6" } }, + "connect": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", + "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.0", + "parseurl": "~1.3.2", + "utils-merge": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" + } + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true + } + } + }, "connect-history-api-fallback": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", @@ -3014,6 +3332,12 @@ "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", "dev": true }, + "dev-ip": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", + "integrity": "sha1-p2o+0YVb56ASu4rBbLgPPADcKPA=", + "dev": true + }, "diffie-hellman": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", @@ -3162,6 +3486,24 @@ "stream-shift": "^1.0.0" } }, + "easy-extender": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz", + "integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==", + "dev": true, + "requires": { + "lodash": "^4.17.10" + } + }, + "eazy-logger": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-3.0.2.tgz", + "integrity": "sha1-oyWqXlPROiIliJsqxBE7K5Y29Pw=", + "dev": true, + "requires": { + "tfunk": "^3.0.1" + } + }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -3240,6 +3582,110 @@ "once": "^1.4.0" } }, + "engine.io": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz", + "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "1.0.0", + "cookie": "0.3.1", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.0", + "ws": "~3.3.1" + }, + "dependencies": { + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "engine.io-parser": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", + "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + } + } + }, + "engine.io-client": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.3.tgz", + "integrity": "sha512-0NGY+9hioejTEJCaSJZfWZLk4FPI9dN+1H1C4+wj2iuFba47UgZbJzfWs4aNFajnX/qAaYKbe2lLTfEEWzCmcw==", + "dev": true, + "requires": { + "component-emitter": "~1.3.0", + "component-inherit": "0.0.3", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "~6.1.0", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "ws": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", + "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "engine.io-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.0.tgz", + "integrity": "sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, "enhanced-resolve": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", @@ -4498,6 +4944,29 @@ } } }, + "has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "dev": true, + "requires": { + "isarray": "2.0.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + } + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "dev": true + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -4941,6 +5410,12 @@ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, + "immutable": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", + "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=", + "dev": true + }, "import-fresh": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", @@ -4987,6 +5462,12 @@ "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", "dev": true }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, "infer-owner": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", @@ -5095,7 +5576,6 @@ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, - "optional": true, "requires": { "binary-extensions": "^2.0.0" } @@ -5217,6 +5697,15 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-number-like": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", + "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", + "dev": true, + "requires": { + "lodash.isfinite": "^3.3.2" + } + }, "is-observable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz", @@ -5515,6 +6004,12 @@ "type-check": "~0.4.0" } }, + "limiter": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", + "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==", + "dev": true + }, "listr": { "version": "0.14.3", "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz", @@ -5649,53 +6144,220 @@ "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", "dev": true, "requires": { - "escape-string-regexp": "^1.0.5" + "escape-string-regexp": "^1.0.5" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + } + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "localtunnel": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.0.tgz", + "integrity": "sha512-g6E0aLgYYDvQDxIjIXkgJo2+pHj3sGg4Wz/XP3h2KtZnRsWPbOQY+hw1H8Z91jep998fkcVE9l+kghO+97vllg==", + "dev": true, + "requires": { + "axios": "0.19.0", + "debug": "4.1.1", + "openurl": "1.1.1", + "yargs": "13.3.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "axios": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz", + "integrity": "sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==", + "dev": true, + "requires": { + "follow-redirects": "1.5.10", + "is-buffer": "^2.0.2" + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "is-buffer": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" } }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "yargs": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", "dev": true, "requires": { - "mimic-fn": "^1.0.0" + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.1" } }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", - "dev": true - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -5720,6 +6382,12 @@ "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" }, + "lodash.isfinite": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", + "integrity": "sha1-+4m2WpqAKBgz8LdHizpRBPiY67M=", + "dev": true + }, "lodash.isinteger": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", @@ -6070,6 +6738,12 @@ "through2": "^2.0.0" } }, + "mitt": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", + "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==", + "dev": true + }, "mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", @@ -6436,6 +7110,12 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", + "dev": true + }, "object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", @@ -6489,6 +7169,12 @@ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, + "object-path": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.9.2.tgz", + "integrity": "sha1-D9mnT8X60a45aLWGvaXGMr1sBaU=", + "dev": true + }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", @@ -6598,6 +7284,12 @@ "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", "dev": true }, + "openurl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", + "integrity": "sha1-OHW0sO96UsFW8NtB1GCduw+Us4c=", + "dev": true + }, "opn": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", @@ -6743,6 +7435,24 @@ "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", "dev": true }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -6963,6 +7673,24 @@ } } }, + "portscanner": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.1.1.tgz", + "integrity": "sha1-6rtAnk3iSVD1oqUW01rnaTQ/u5Y=", + "dev": true, + "requires": { + "async": "1.5.2", + "is-number-like": "^1.0.3" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + } + } + }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -7424,7 +8152,6 @@ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", "dev": true, - "optional": true, "requires": { "picomatch": "^2.2.1" } @@ -7634,6 +8361,27 @@ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", "dev": true }, + "resp-modifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz", + "integrity": "sha1-sSTeXE+6/LpUH0j/pzlw9KpFa08=", + "dev": true, + "requires": { + "debug": "^2.2.0", + "minimatch": "^3.0.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, "restore-cursor": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", @@ -7684,6 +8432,12 @@ "aproba": "^1.1.1" } }, + "rx": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", + "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", + "dev": true + }, "rxjs": { "version": "6.6.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", @@ -7867,6 +8621,12 @@ "send": "0.17.1" } }, + "server-destroy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", + "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=", + "dev": true + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -8085,6 +8845,186 @@ } } }, + "socket.io": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", + "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", + "dev": true, + "requires": { + "debug": "~3.1.0", + "engine.io": "~3.2.0", + "has-binary2": "~1.0.2", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.1.1", + "socket.io-parser": "~3.2.0" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "engine.io-client": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", + "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.1", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "~3.3.1", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + } + }, + "engine.io-parser": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", + "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + }, + "socket.io-client": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz", + "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==", + "dev": true, + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "engine.io-client": "~3.2.0", + "has-binary2": "~1.0.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "~3.2.0", + "to-array": "0.1.4" + } + }, + "socket.io-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", + "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "isarray": "2.0.1" + } + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + } + } + }, + "socket.io-adapter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", + "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", + "dev": true + }, + "socket.io-client": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.3.0.tgz", + "integrity": "sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==", + "dev": true, + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "~4.1.0", + "engine.io-client": "~3.4.0", + "has-binary2": "~1.0.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "~3.3.0", + "to-array": "0.1.4" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "socket.io-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.0.tgz", + "integrity": "sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + } + } + }, "sockjs": { "version": "0.3.20", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz", @@ -8581,6 +9521,24 @@ "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", "dev": true }, + "stream-throttle": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", + "integrity": "sha1-rdV8jXzHOoFjDTHNVdOWHPr7qcM=", + "dev": true, + "requires": { + "commander": "^2.2.0", + "limiter": "^1.0.5" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + } + } + }, "string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", @@ -8859,6 +9817,58 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, + "tfunk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tfunk/-/tfunk-3.1.0.tgz", + "integrity": "sha1-OORBT8ZJd9h6/apy+sttKfgve1s=", + "dev": true, + "requires": { + "chalk": "^1.1.1", + "object-path": "^0.9.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, "throttleit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", @@ -8915,6 +9925,12 @@ "rimraf": "^3.0.0" } }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "dev": true + }, "to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", @@ -9094,6 +10110,18 @@ "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", "dev": true }, + "ua-parser-js": { + "version": "0.7.21", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.21.tgz", + "integrity": "sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==", + "dev": true + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "dev": true + }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -10650,6 +11678,12 @@ "async-limiter": "~1.0.0" } }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", + "dev": true + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -10706,6 +11740,12 @@ "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true } } } diff --git a/package.json b/package.json index 4a71c9d..9d70ed3 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "description": "A MERN application bootstrapped with create-mern-application.", "main": "build/index.js", "scripts": { + "browsersync": "browser-sync start --proxy \"http://localhost:8080\"", "build": "npm run format && npm run lint && npm run build-client && npm run build-server", "build-client": "rimraf dist && webpack --display=errors-only", "build-server": "rimraf build && tsc && copyfiles -f src/server/assets/**/* build/assets", diff --git a/src/server/app.ts b/src/server/app.ts index 8c10af4..2c9d8c3 100644 --- a/src/server/app.ts +++ b/src/server/app.ts @@ -46,6 +46,10 @@ class App { "http://localhost:8080", "https://gh-jobs.herokuapp.com", "https://www.githubjobs.io", + "http://localhost:3001", // * Browsersync + "http://192.168.1.228:3001", // * Browsersync + "http://localhost:3002", // * Browsersync + "http://192.168.1.228:3002", // * Browsersync undefined, ]; From 0cddd100efecf918724a8b2e2a29407ad12e0b2e Mon Sep 17 00:00:00 2001 From: alexlee-dev Date: Sat, 22 Aug 2020 17:30:56 -0700 Subject: [PATCH 13/17] =?UTF-8?q?=F0=9F=90=9B=20Broken=20SearchInput=20Sty?= =?UTF-8?q?le=20#81=20-=20Adjust=20Style?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/SearchInput/SearchInput-styled.tsx | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/client/components/SearchInput/SearchInput-styled.tsx b/src/client/components/SearchInput/SearchInput-styled.tsx index 477421b..c839448 100644 --- a/src/client/components/SearchInput/SearchInput-styled.tsx +++ b/src/client/components/SearchInput/SearchInput-styled.tsx @@ -41,6 +41,14 @@ const SearchInputLeft = styled.div` color: #b9bdcf; font-size: 16px; } + + @media only screen and (max-width: 600px) { + margin-right: -4px; + + i { + margin-right: 4px; + } + } `; const SearchInputInput = styled.input` @@ -75,6 +83,12 @@ const SearchInputButtonContainer = styled.div` border: 3px solid #ffffff; box-shadow: none; } + + @media only screen and (max-width: 600px) { + background-color: #ffffff; + border-bottom-right-radius: 0.25rem; + border-top-right-radius: 0.25rem; + } `; export { From 5c140588b04ebfd9e9ba90c4b6191ad335ba9972 Mon Sep 17 00:00:00 2001 From: alexlee-dev Date: Sat, 22 Aug 2020 17:38:44 -0700 Subject: [PATCH 14/17] =?UTF-8?q?=F0=9F=90=9B=20Broken=20SearchInput=20Sty?= =?UTF-8?q?le=20#81=20-=20Adjust=20Test=20for=20Location=20Search?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cypress/integration/optionsPanel.spec.js | 2 +- src/server/controllers/job.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cypress/integration/optionsPanel.spec.js b/cypress/integration/optionsPanel.spec.js index a1cc4c7..d580085 100644 --- a/cypress/integration/optionsPanel.spec.js +++ b/cypress/integration/optionsPanel.spec.js @@ -55,7 +55,7 @@ context("Options Panel", () => { }); it("Should be able to search within the OptionsPanel", () => { - cy.get("#location-search").type("Los Angeles"); + cy.get("#location-search").type("Acopampa"); cy.get("#options-panel-search").click(); cy.get("#notification").should("have.text", "Search returned 5 results."); diff --git a/src/server/controllers/job.ts b/src/server/controllers/job.ts index f1401d9..cf7a4ff 100644 --- a/src/server/controllers/job.ts +++ b/src/server/controllers/job.ts @@ -124,7 +124,7 @@ class JobController { // * If there is a location in the search, use the API // * If there is not a location, just query the DB - if (isLocationSearch) { + if (isLocationSearch && process.env.NODE_ENV !== "test") { const jobs: GitHubJob[] = []; let jobsInBatch = null; let page = 1; From 2493478dcbe9d0d9383726a292e6e1ebe0bdaa3c Mon Sep 17 00:00:00 2001 From: alexlee-dev Date: Sat, 22 Aug 2020 17:45:29 -0700 Subject: [PATCH 15/17] =?UTF-8?q?=F0=9F=90=9B=20Broken=20SearchInput=20Sty?= =?UTF-8?q?le=20#81=20-=20Adjust=20again?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cypress/integration/optionsPanel.spec.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cypress/integration/optionsPanel.spec.js b/cypress/integration/optionsPanel.spec.js index d580085..896b64b 100644 --- a/cypress/integration/optionsPanel.spec.js +++ b/cypress/integration/optionsPanel.spec.js @@ -54,10 +54,11 @@ context("Options Panel", () => { cy.get("#notification").should("have.text", "Search returned 13 results."); }); + // * Doesn't really do a full location search - since that would use the actual GitHub API and not the test DB it("Should be able to search within the OptionsPanel", () => { cy.get("#location-search").type("Acopampa"); cy.get("#options-panel-search").click(); - cy.get("#notification").should("have.text", "Search returned 5 results."); + cy.get("#notification").should("have.text", "Search returned 50 results."); }); }); From 063bcdaad63d88ee4b42a70dddd1292e16b6e491 Mon Sep 17 00:00:00 2001 From: alexlee-dev Date: Mon, 24 Aug 2020 08:10:25 -0700 Subject: [PATCH 16/17] =?UTF-8?q?=F0=9F=8E=A8=20ProfileAccountDetails=20Di?= =?UTF-8?q?sabled=20Left=20Icon=20color=20#84=20-=20Adjust=20Style?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/client/components/Input/Input-styled.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/client/components/Input/Input-styled.tsx b/src/client/components/Input/Input-styled.tsx index ee7cf84..1ff387b 100644 --- a/src/client/components/Input/Input-styled.tsx +++ b/src/client/components/Input/Input-styled.tsx @@ -43,6 +43,7 @@ const StyledInputInnerContainer = styled.div` line-height: 14px; margin-bottom: 0; min-width: 0; + opacity: 1; padding: 0.375rem 0.75rem; transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; width: 1%; From 01e207112a432044f0341a3fde09a596db000c1b Mon Sep 17 00:00:00 2001 From: alexlee-dev Date: Mon, 24 Aug 2020 08:37:31 -0700 Subject: [PATCH 17/17] =?UTF-8?q?=F0=9F=93=9D=20CHANGELOG=20-=20Update=20C?= =?UTF-8?q?HANGELOG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 83d4cb4..9210d44 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,16 +5,26 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [1.8.0] - _Unreleased_ +## [1.8.0] - 2020-08-24 + +### 👩‍🔬 Test Database ### Added +- Test database - [#91](https://github.com/alexlee-dev/gh-jobs/issues/91) + ### Changed +- Update Cypress to v5.0.0 - [#101](https://github.com/alexlee-dev/gh-jobs/issues/101) +- Refactor `Thunks` - [#103](https://github.com/alexlee-dev/gh-jobs/issues/103) + ### Removed ### Fixed +- `SearchInput` style - [#81](https://github.com/alexlee-dev/gh-jobs/issues/81) +- `ProfileAccountDetails` input disabled style - [#84](https://github.com/alexlee-dev/gh-jobs/issues/84) + ## [1.7.0] - 2020-08-20 ### 🐛 Bug Fixeroo Numbah 2