From 4e94a3ade1b4ef614261ccbfbc651791fadc847c Mon Sep 17 00:00:00 2001 From: Yury Savin Date: Sat, 13 Apr 2019 14:51:24 +0300 Subject: [PATCH 1/5] =?UTF-8?q?=F0=9F=93=A6=20=E2=9E=95=20backstopjs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 1 + yarn.lock | 305 ++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 291 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index 7ba1ffdff..9daef411e 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "antd": "4.15.1", "axios": "0.21.2", "babel-plugin-import": "1.13.3", + "backstopjs": "^6.0.2", "customize-cra": "1.0.0", "date-fns": "2.21.1", "eslint": "^6.1.0", diff --git a/yarn.lock b/yarn.lock index 3185e2f9d..c034c48b6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1416,6 +1416,14 @@ "@types/yargs" "^16.0.0" chalk "^4.0.0" +"@mirzazeyrek/node-resemble-js@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@mirzazeyrek/node-resemble-js/-/node-resemble-js-1.2.1.tgz#9ecb6cdc15ba049f0638bafb1e8fef4accba8d41" + integrity sha512-+z1c7HpC5ysdSVVyUVz67hctVLl337VlRJP/MBwpvXHkKJdlnSUVrBhlRzxgal7xpm1uDE2JeUhWbQh6wPRC4w== + dependencies: + jpeg-js "^0.4.2" + pngjs "^6.0.0" + "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" @@ -2198,7 +2206,7 @@ adjust-sourcemap-loader@3.0.0: loader-utils "^2.0.0" regex-parser "^2.2.11" -agent-base@6: +agent-base@6, agent-base@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== @@ -2829,6 +2837,30 @@ babylon@^6.18.0: resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== +backstopjs@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/backstopjs/-/backstopjs-6.0.2.tgz#89da7e817d48defeecd139946b1552eb0155dce0" + integrity sha512-oww7tDmeinCrV5vQ6tsoBuYVI12nWys1UpQ3bSmOuI5kySaQ+6U2obxCZfUzilmvdJwhGcDxfqkZbpTpRu91Sg== + dependencies: + "@mirzazeyrek/node-resemble-js" "^1.2.1" + chalk "^1.1.3" + diverged "^0.1.3" + fs-extra "^0.30.0" + jump.js "^1.0.2" + junit-report-builder "^1.3.3" + lodash "^4.17.11" + minimist "^1.2.0" + object-hash "1.1.5" + opn "^5.3.0" + os "^0.1.1" + p-map "^1.1.1" + path "^0.12.7" + playwright "^1.16.3" + portfinder "^1.0.17" + puppeteer "^12.0.0" + super-simple-web-server "^1.1.2" + temp "^0.8.3" + balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" @@ -3605,7 +3637,7 @@ commander@^4.1.1: resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== -commander@^8.3.0: +commander@^8.2.0, commander@^8.3.0: version "8.3.0" resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== @@ -4153,6 +4185,11 @@ date-fns@^2.15.0: resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.15.0.tgz#424de6b3778e4e69d3ff27046ec136af58ae5d5f" integrity sha512-ZCPzAMJZn3rNUvvQIMlXhDr4A+Ar07eLeGsGREoWU19a3Pqf5oYa+ccd+B3F6XVtQY6HANMFdOQ8A+ipFnvJdQ== +date-format@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/date-format/-/date-format-0.0.2.tgz#fafd448f72115ef1e2b739155ae92f2be6c28dd1" + integrity sha1-+v1Ej3IRXvHitzkVWukvK+bCjdE= + debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -4188,7 +4225,7 @@ debug@^3.2.7: dependencies: ms "^2.1.1" -debug@^4.3.2: +debug@^4.3.1, debug@^4.3.2: version "4.3.3" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== @@ -4335,6 +4372,11 @@ diff-sequences@^27.4.0: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.4.0.tgz#d783920ad8d06ec718a060d00196dfef25b132a5" integrity sha512-YqiQzkrsmHMH5uuh8OdQFU9/ZpADnwzml8z0O5HvRNda+5UZsaX/xN+AAxfR2hWq1Y7HZnAzO9J5lJXOuDz2Ww== +diff@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== + diff@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" @@ -4364,6 +4406,16 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" +diverged@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/diverged/-/diverged-0.1.3.tgz#fbde8eba086e8ff01327d32d71ebaabb1084fca4" + integrity sha512-W8BLyp4Eo+YW9uQ3F5c9BXDT9ITCARA2CFQVb+v57FWYfkr0XjwNOASZacDCq+syk1i/obZ4BZ3w1qtlRO6hQw== + dependencies: + diff "^3.5.0" + pixelmatch "^4.0.2" + pngjs "^3.3.3" + super-simple-web-server "^1.0.0" + dns-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" @@ -4725,7 +4777,7 @@ escape-html@^1.0.3, escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= -escape-string-regexp@2.0.0: +escape-string-regexp@2.0.0, escape-string-regexp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== @@ -5157,7 +5209,7 @@ expect@^24.9.0: jest-message-util "^24.9.0" jest-regex-util "^24.9.0" -express@^4.17.1: +express@^4.16.3, express@^4.17.1: version "4.17.1" resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== @@ -5243,7 +5295,7 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" -extract-zip@2.0.1: +extract-zip@2.0.1, extract-zip@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== @@ -5603,6 +5655,17 @@ fs-constants@^1.0.0: resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== +fs-extra@^0.30.0: + version "0.30.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" + integrity sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A= + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + path-is-absolute "^1.0.0" + rimraf "^2.2.8" + fs-extra@^4.0.2: version "4.0.3" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" @@ -5861,6 +5924,11 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== +graceful-fs@^4.1.9, graceful-fs@^4.2.4: + version "4.2.8" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" + integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== + growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" @@ -6188,7 +6256,7 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= -https-proxy-agent@5.0.0: +https-proxy-agent@5.0.0, https-proxy-agent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== @@ -7299,6 +7367,11 @@ jest@24.9.0: import-local "^2.0.0" jest-cli "^24.9.0" +jpeg-js@^0.4.2: + version "0.4.3" + resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.4.3.tgz#6158e09f1983ad773813704be80680550eff977b" + integrity sha512-ru1HWKek8octvUHFHvE5ZzQ1yAsJmIvRdGWvSoKV52XKyuyYA437QWDttXT8eZXDSbuMpHlLzPDZUPd6idIz+Q== + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -7454,6 +7527,13 @@ json5@^2.1.2: dependencies: minimist "^1.2.5" +jsonfile@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= + optionalDependencies: + graceful-fs "^4.1.6" + jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" @@ -7484,6 +7564,21 @@ jsx-ast-utils@^2.2.1, jsx-ast-utils@^2.2.3: array-includes "^3.1.1" object.assign "^4.1.0" +jump.js@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/jump.js/-/jump.js-1.0.2.tgz#e0641b47f40a38f2139c25fda0500bf28e43015a" + integrity sha1-4GQbR/QKOPITnCX9oFAL8o5DAVo= + +junit-report-builder@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/junit-report-builder/-/junit-report-builder-1.3.3.tgz#a848e9ef1b1664b855d1abf8766c39f0a9c5ff33" + integrity sha512-75bwaXjP/3ogyzOSkkcshXGG7z74edkJjgTZlJGAyzxlOHaguexM3VLG6JyD9ZBF8mlpgsUPB1sIWU4LISgeJw== + dependencies: + date-format "0.0.2" + lodash "^4.17.15" + mkdirp "^0.5.0" + xmlbuilder "^10.0.0" + killable@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" @@ -7520,6 +7615,13 @@ kind-of@^6.0.0, kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== +klaw@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk= + optionalDependencies: + graceful-fs "^4.1.9" + kleur@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" @@ -7984,6 +8086,11 @@ mime@^2.4.4: resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.6.tgz#e5b407c90db442f2beb5b162373d07b69affa4d1" integrity sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA== +mime@^2.4.6: + version "2.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" @@ -8102,7 +8209,7 @@ mkdirp-classic@^0.5.2: resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== -mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1: +mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== @@ -8394,6 +8501,11 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" +object-hash@1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.1.5.tgz#bdd844e030d0861b692ca175c6cab6868ec233d7" + integrity sha1-vdhE4DDQhhtpLKF1xsq2ho7CM9c= + object-hash@^2.0.1: version "2.0.3" resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.0.3.tgz#d12db044e03cd2ca3d77c0570d87225b02e1e6ea" @@ -8559,7 +8671,7 @@ open@^7.3.1: is-docker "^2.0.0" is-wsl "^2.1.1" -opn@^5.5.0: +opn@^5.3.0, opn@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== @@ -8618,6 +8730,11 @@ os-tmpdir@~1.0.2: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= +os@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/os/-/os-0.1.2.tgz#f29a50c62908516ba42652de42f7038600cadbc2" + integrity sha512-ZoXJkvAnljwvc56MbvhtKVWmSkzV712k42Is2mA0+0KTSRakq5XXuXpjZjgAt9ctzl51ojhQWakQQpmOvXWfjQ== + p-each-series@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71" @@ -8665,6 +8782,11 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" +p-map@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" + integrity sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA== + p-map@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" @@ -8882,6 +9004,14 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +path@^0.12.7: + version "0.12.7" + resolved "https://registry.yarnpkg.com/path/-/path-0.12.7.tgz#d4dc2a506c4ce2197eb481ebfcd5b36c0140b10f" + integrity sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8= + dependencies: + process "^0.11.1" + util "^0.10.3" + pbkdf2@^3.0.3: version "3.1.1" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94" @@ -8947,6 +9077,13 @@ pirates@^4.0.1: dependencies: node-modules-regexp "^1.0.0" +pixelmatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/pixelmatch/-/pixelmatch-4.0.2.tgz#8f47dcec5011b477b67db03c243bc1f3085e8854" + integrity sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ= + dependencies: + pngjs "^3.0.0" + pkg-dir@4.2.0, pkg-dir@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" @@ -8989,11 +9126,55 @@ pkg-up@^2.0.0: dependencies: find-up "^2.1.0" +playwright-core@=1.17.1: + version "1.17.1" + resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.17.1.tgz#a16e0f89284a0ed8ae6d77e1c905c84b8a2ba022" + integrity sha512-C3c8RpPiC3qr15fRDN6dx6WnUkPLFmST37gms2aoHPDRvp7EaGDPMMZPpqIm/QWB5J40xDrQCD4YYHz2nBTojQ== + dependencies: + commander "^8.2.0" + debug "^4.1.1" + extract-zip "^2.0.1" + https-proxy-agent "^5.0.0" + jpeg-js "^0.4.2" + mime "^2.4.6" + pngjs "^5.0.0" + progress "^2.0.3" + proper-lockfile "^4.1.1" + proxy-from-env "^1.1.0" + rimraf "^3.0.2" + socks-proxy-agent "^6.1.0" + stack-utils "^2.0.3" + ws "^7.4.6" + yauzl "^2.10.0" + yazl "^2.5.1" + +playwright@^1.16.3: + version "1.17.1" + resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.17.1.tgz#a6d63302ee40f41283c4bf869de261c4743a787c" + integrity sha512-DisCkW9MblDJNS3rG61p8LiLA2WA7IY/4A4W7DX4BphWe/HuWjKmGQptuk4NVIh5UuSwXpW/jaH2+ZgjHs3GMA== + dependencies: + playwright-core "=1.17.1" + pn@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== +pngjs@^3.0.0, pngjs@^3.3.3: + version "3.4.0" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" + integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== + +pngjs@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb" + integrity sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw== + +pngjs@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-6.0.0.tgz#ca9e5d2aa48db0228a52c419c3308e87720da821" + integrity sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg== + pnp-webpack-plugin@1.6.4: version "1.6.4" resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" @@ -9001,7 +9182,7 @@ pnp-webpack-plugin@1.6.4: dependencies: ts-pnp "^1.1.6" -portfinder@^1.0.26: +portfinder@^1.0.17, portfinder@^1.0.26: version "1.0.28" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA== @@ -9751,12 +9932,12 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -process@^0.11.10: +process@^0.11.1, process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= -progress@2.0.3, progress@^2.0.0: +progress@2.0.3, progress@^2.0.0, progress@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== @@ -9790,6 +9971,15 @@ prop-types@15.7.2, prop-types@^15.6.2, prop-types@^15.7.2: object-assign "^4.1.1" react-is "^16.8.1" +proper-lockfile@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/proper-lockfile/-/proper-lockfile-4.1.2.tgz#c8b9de2af6b2f1601067f98e01ac66baa223141f" + integrity sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA== + dependencies: + graceful-fs "^4.2.4" + retry "^0.12.0" + signal-exit "^3.0.2" + proxy-addr@~2.0.5: version "2.0.6" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" @@ -9798,7 +9988,7 @@ proxy-addr@~2.0.5: forwarded "~0.1.2" ipaddr.js "1.9.1" -proxy-from-env@1.1.0: +proxy-from-env@1.1.0, proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== @@ -9883,6 +10073,24 @@ puppeteer-core@^12.0.1: unbzip2-stream "1.4.3" ws "8.2.3" +puppeteer@^12.0.0: + version "12.0.1" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-12.0.1.tgz#ae79d0e174a07563e0bf2e05c94ccafce3e70033" + integrity sha512-YQ3GRiyZW0ddxTW+iiQcv2/8TT5c3+FcRUCg7F8q2gHqxd5akZN400VRXr9cHQKLWGukmJLDiE72MrcLK9tFHQ== + dependencies: + debug "4.3.2" + devtools-protocol "0.0.937139" + extract-zip "2.0.1" + https-proxy-agent "5.0.0" + node-fetch "2.6.5" + pkg-dir "4.2.0" + progress "2.0.3" + proxy-from-env "1.1.0" + rimraf "3.0.2" + tar-fs "2.1.1" + unbzip2-stream "1.4.3" + ws "8.2.3" + q@^1.1.2: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" @@ -11031,14 +11239,14 @@ rimraf@2.6.3, rimraf@~2.6.2: dependencies: glob "^7.1.3" -rimraf@3.0.2: +rimraf@3.0.2, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" -rimraf@^2.5.4, rimraf@^2.6.3, rimraf@^2.7.1: +rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.3, rimraf@^2.7.1: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -11463,6 +11671,11 @@ slice-ansi@^5.0.0: ansi-styles "^6.0.0" is-fullwidth-code-point "^4.0.0" +smart-buffer@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -11514,6 +11727,23 @@ sockjs@0.3.20: uuid "^3.4.0" websocket-driver "0.6.5" +socks-proxy-agent@^6.1.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz#e664e8f1aaf4e1fb3df945f09e3d94f911137f87" + integrity sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew== + dependencies: + agent-base "^6.0.2" + debug "^4.3.1" + socks "^2.6.1" + +socks@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.6.1.tgz#989e6534a07cf337deb1b1c94aaa44296520d30e" + integrity sha512-kLQ9N5ucj8uIcxrDwjm0Jsqk06xdpBjGNQtpXy4Q8/QY2k+fY7nZH8CARy+hkbG+SGAovmzzuauCpBlb8FrnBA== + dependencies: + ip "^1.1.5" + smart-buffer "^4.1.0" + sort-keys@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" @@ -11684,6 +11914,13 @@ stack-utils@^1.0.1: resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== +stack-utils@^2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" + integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== + dependencies: + escape-string-regexp "^2.0.0" + static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -11951,6 +12188,13 @@ stylehacks@^4.0.0: postcss "^7.0.0" postcss-selector-parser "^3.0.0" +super-simple-web-server@^1.0.0, super-simple-web-server@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/super-simple-web-server/-/super-simple-web-server-1.1.2.tgz#60137e531e1a4a3647f40eff1a88c8df8cdb16d1" + integrity sha512-18yaU4aGj24bRnk2HLQxXepV53SDQI7xWaoVoxb8U0ujOm/wbC+IY7wmuT6fV24qOlxqmqpVbjaKfw25NjRr0w== + dependencies: + express "^4.16.3" + supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" @@ -12047,6 +12291,13 @@ tar-stream@^2.1.4: inherits "^2.0.3" readable-stream "^3.1.1" +temp@^0.8.3: + version "0.8.4" + resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.4.tgz#8c97a33a4770072e0a05f919396c7665a7dd59f2" + integrity sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg== + dependencies: + rimraf "~2.6.2" + temp@^0.9.4: version "0.9.4" resolved "https://registry.yarnpkg.com/temp/-/temp-0.9.4.tgz#cd20a8580cb63635d0e4e9d4bd989d44286e7620" @@ -12542,6 +12793,13 @@ util@0.10.3: dependencies: inherits "2.0.1" +util@^0.10.3: + version "0.10.4" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" + integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== + dependencies: + inherits "2.0.3" + util@^0.11.0: version "0.11.1" resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" @@ -13098,11 +13356,21 @@ ws@^6.1.2, ws@^6.2.1: dependencies: async-limiter "~1.0.0" +ws@^7.4.6: + version "7.5.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.6.tgz#e59fc509fb15ddfb65487ee9765c5a51dec5fe7b" + integrity sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA== + xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== +xmlbuilder@^10.0.0: + version "10.1.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-10.1.1.tgz#8cae6688cc9b38d850b7c8d3c0a4161dcaf475b0" + integrity sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg== + xmlchars@^2.1.1: version "2.2.0" resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" @@ -13200,6 +13468,13 @@ yauzl@^2.10.0: buffer-crc32 "~0.2.3" fd-slicer "~1.1.0" +yazl@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/yazl/-/yazl-2.5.1.tgz#a3d65d3dd659a5b0937850e8609f22fffa2b5c35" + integrity sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw== + dependencies: + buffer-crc32 "~0.2.3" + yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" From 39ce6959e8a62a4406f32178941076d220437933 Mon Sep 17 00:00:00 2001 From: Yury Savin Date: Sat, 13 Apr 2019 14:54:11 +0300 Subject: [PATCH 2/5] =?UTF-8?q?=F0=9F=94=A7=20backstop=20init?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backstop.json | 54 ++++++++++++++ .../casper/clickAndHoverHelper.js | 25 +++++++ .../engine_scripts/casper/loadCookies.js | 20 ++++++ .../engine_scripts/casper/onBefore.js | 6 ++ .../engine_scripts/casper/onReady.js | 5 ++ .../casper/waitForHelperHelper.js | 18 +++++ .../chromy/clickAndHoverHelper.js | 43 +++++++++++ .../engine_scripts/chromy/loadCookies.js | 22 ++++++ .../engine_scripts/chromy/onBefore.js | 6 ++ .../engine_scripts/chromy/onReady.js | 5 ++ backstop_data/engine_scripts/cookies.json | 14 ++++ backstop_data/engine_scripts/imageStub.jpg | Bin 0 -> 2900 bytes .../puppet/clickAndHoverHelper.js | 43 +++++++++++ .../engine_scripts/puppet/ignoreCSP.js | 67 ++++++++++++++++++ .../engine_scripts/puppet/interceptImages.js | 37 ++++++++++ .../engine_scripts/puppet/loadCookies.js | 29 ++++++++ .../engine_scripts/puppet/onBefore.js | 3 + .../engine_scripts/puppet/onReady.js | 6 ++ 18 files changed, 403 insertions(+) create mode 100644 backstop.json create mode 100644 backstop_data/engine_scripts/casper/clickAndHoverHelper.js create mode 100644 backstop_data/engine_scripts/casper/loadCookies.js create mode 100644 backstop_data/engine_scripts/casper/onBefore.js create mode 100644 backstop_data/engine_scripts/casper/onReady.js create mode 100644 backstop_data/engine_scripts/casper/waitForHelperHelper.js create mode 100644 backstop_data/engine_scripts/chromy/clickAndHoverHelper.js create mode 100644 backstop_data/engine_scripts/chromy/loadCookies.js create mode 100644 backstop_data/engine_scripts/chromy/onBefore.js create mode 100644 backstop_data/engine_scripts/chromy/onReady.js create mode 100644 backstop_data/engine_scripts/cookies.json create mode 100644 backstop_data/engine_scripts/imageStub.jpg create mode 100644 backstop_data/engine_scripts/puppet/clickAndHoverHelper.js create mode 100644 backstop_data/engine_scripts/puppet/ignoreCSP.js create mode 100644 backstop_data/engine_scripts/puppet/interceptImages.js create mode 100644 backstop_data/engine_scripts/puppet/loadCookies.js create mode 100644 backstop_data/engine_scripts/puppet/onBefore.js create mode 100644 backstop_data/engine_scripts/puppet/onReady.js diff --git a/backstop.json b/backstop.json new file mode 100644 index 000000000..ccdf7831d --- /dev/null +++ b/backstop.json @@ -0,0 +1,54 @@ +{ + "id": "backstop_default", + "viewports": [ + { + "label": "phone", + "width": 320, + "height": 480 + }, + { + "label": "tablet", + "width": 1024, + "height": 768 + } + ], + "onBeforeScript": "puppet/onBefore.js", + "onReadyScript": "puppet/onReady.js", + "scenarios": [ + { + "label": "BackstopJS Homepage", + "cookiePath": "backstop_data/engine_scripts/cookies.json", + "url": "https://garris.github.io/BackstopJS/", + "referenceUrl": "", + "readyEvent": "", + "readySelector": "", + "delay": 0, + "hideSelectors": [], + "removeSelectors": [], + "hoverSelector": "", + "clickSelector": "", + "postInteractionWait": 0, + "selectors": [], + "selectorExpansion": true, + "expect": 0, + "misMatchThreshold": 0.1, + "requireSameDimensions": true + } + ], + "paths": { + "bitmaps_reference": "backstop_data/bitmaps_reference", + "bitmaps_test": "backstop_data/bitmaps_test", + "engine_scripts": "backstop_data/engine_scripts", + "html_report": "backstop_data/html_report", + "ci_report": "backstop_data/ci_report" + }, + "report": ["browser"], + "engine": "puppeteer", + "engineOptions": { + "args": ["--no-sandbox"] + }, + "asyncCaptureLimit": 5, + "asyncCompareLimit": 50, + "debug": false, + "debugWindow": false +} diff --git a/backstop_data/engine_scripts/casper/clickAndHoverHelper.js b/backstop_data/engine_scripts/casper/clickAndHoverHelper.js new file mode 100644 index 000000000..038321a68 --- /dev/null +++ b/backstop_data/engine_scripts/casper/clickAndHoverHelper.js @@ -0,0 +1,25 @@ +var WAIT_TIMEOUT = 5000; + +module.exports = function(casper, scenario) { + var waitFor = require('./waitForHelperHelper')(casper, WAIT_TIMEOUT); + var hoverSelector = scenario.hoverSelector; + var clickSelector = scenario.clickSelector; + var postInteractionWait = scenario.postInteractionWait; + + if (hoverSelector) { + waitFor(hoverSelector); + casper.then(function() { + casper.mouse.move(hoverSelector); + }); + } + + if (clickSelector) { + waitFor(clickSelector); + casper.then(function() { + casper.click(clickSelector); + }); + } + + // TODO: if postInteractionWait === integer then do ==> wait(postInteractionWait) || elsevvv + waitFor(postInteractionWait); +}; diff --git a/backstop_data/engine_scripts/casper/loadCookies.js b/backstop_data/engine_scripts/casper/loadCookies.js new file mode 100644 index 000000000..fc51d13e4 --- /dev/null +++ b/backstop_data/engine_scripts/casper/loadCookies.js @@ -0,0 +1,20 @@ +var fs = require('fs'); + +module.exports = function(casper, scenario) { + var cookies = []; + var cookiePath = scenario.cookiePath; + + // READ COOKIES FROM FILE IF EXISTS + if (fs.existsSync(cookiePath)) { + cookies = JSON.parse(fs.readFileSync(cookiePath)); + } + + casper.page.cookies = cookies; + console.log( + 'Cookie state restored with cookies:', + JSON.stringify(cookies, null, 2) + ); + casper.userAgent( + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36' + ); +}; diff --git a/backstop_data/engine_scripts/casper/onBefore.js b/backstop_data/engine_scripts/casper/onBefore.js new file mode 100644 index 000000000..f90eb4332 --- /dev/null +++ b/backstop_data/engine_scripts/casper/onBefore.js @@ -0,0 +1,6 @@ +module.exports = function(casper, scenario, vp) { + require('./loadCookies')(casper, scenario); + casper.userAgent( + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36' + ); +}; diff --git a/backstop_data/engine_scripts/casper/onReady.js b/backstop_data/engine_scripts/casper/onReady.js new file mode 100644 index 000000000..1f8970707 --- /dev/null +++ b/backstop_data/engine_scripts/casper/onReady.js @@ -0,0 +1,5 @@ +module.exports = function(casper, scenario, vp) { + console.log('SCENARIO> ' + scenario.label); + require('./clickAndHoverHelper')(casper, scenario); + // add more helpers here... +}; diff --git a/backstop_data/engine_scripts/casper/waitForHelperHelper.js b/backstop_data/engine_scripts/casper/waitForHelperHelper.js new file mode 100644 index 000000000..e5527177c --- /dev/null +++ b/backstop_data/engine_scripts/casper/waitForHelperHelper.js @@ -0,0 +1,18 @@ +var TIMEOUT_DEFAULT = 2000; + +module.exports = function(casper, timeout) { + var TIMEOUT = timeout || TIMEOUT_DEFAULT; + + return function waitFor(selector) { + if (selector) { + casper.waitForSelector( + selector, + function() {}, + function() { + console.error('NOT FOUND > ' + selector); + }, + TIMEOUT + ); + } + }; +}; diff --git a/backstop_data/engine_scripts/chromy/clickAndHoverHelper.js b/backstop_data/engine_scripts/chromy/clickAndHoverHelper.js new file mode 100644 index 000000000..034741065 --- /dev/null +++ b/backstop_data/engine_scripts/chromy/clickAndHoverHelper.js @@ -0,0 +1,43 @@ +module.exports = function(chromy, scenario) { + var hoverSelector = scenario.hoverSelectors || scenario.hoverSelector; + var clickSelector = scenario.clickSelectors || scenario.clickSelector; + var keyPressSelector = + scenario.keyPressSelectors || scenario.keyPressSelector; + var scrollToSelector = + scenario.scrollToSelectors || scenario.scrollToSelector; + var postInteractionWait = scenario.postInteractionWait; // selector [str] | ms [int] + + if (keyPressSelector) { + for (const keyPressSelectorItem of [].concat(keyPressSelector)) { + chromy + .wait(keyPressSelectorItem.selector) + .insert(keyPressSelectorItem.selector, keyPressSelectorItem.keyPress); + } + } + + if (hoverSelector) { + chromy + .wait(hoverSelector) + .rect(hoverSelector) + .result(function(rect) { + chromy.mouseMoved(rect.left, rect.top); + }); + } + + if (clickSelector) { + chromy.wait(clickSelector).click(clickSelector); + } + + if (postInteractionWait) { + chromy.wait(postInteractionWait); + } + + if (scrollToSelector) { + chromy + .wait(scrollToSelector) + .evaluate(`window._scrollToSelector = '${scrollToSelector}'`) + .evaluate(function() { + document.querySelector(window._scrollToSelector).scrollIntoView(); + }); + } +}; diff --git a/backstop_data/engine_scripts/chromy/loadCookies.js b/backstop_data/engine_scripts/chromy/loadCookies.js new file mode 100644 index 000000000..5ae1f626b --- /dev/null +++ b/backstop_data/engine_scripts/chromy/loadCookies.js @@ -0,0 +1,22 @@ +var fs = require('fs'); + +module.exports = function(chromy, scenario) { + var cookies = []; + var cookiePath = scenario.cookiePath; + + // READ COOKIES FROM FILE IF EXISTS + if (fs.existsSync(cookiePath)) { + cookies = JSON.parse(fs.readFileSync(cookiePath)); + } + + // MUNGE COOKIE DOMAIN FOR CHROMY USAGE + cookies = cookies.map(cookie => { + cookie.url = 'https://' + cookie.domain; + delete cookie.domain; + return cookie; + }); + + // SET COOKIES VIA CHROMY + chromy.setCookie(cookies); + console.log('Cookie state restored with:', JSON.stringify(cookies, null, 2)); +}; diff --git a/backstop_data/engine_scripts/chromy/onBefore.js b/backstop_data/engine_scripts/chromy/onBefore.js new file mode 100644 index 000000000..c51405690 --- /dev/null +++ b/backstop_data/engine_scripts/chromy/onBefore.js @@ -0,0 +1,6 @@ +module.exports = function(chromy, scenario, vp) { + require('./loadCookies')(chromy, scenario); + + // IGNORE ANY CERT WARNINGS + chromy.ignoreCertificateErrors(); +}; diff --git a/backstop_data/engine_scripts/chromy/onReady.js b/backstop_data/engine_scripts/chromy/onReady.js new file mode 100644 index 000000000..acfc0691c --- /dev/null +++ b/backstop_data/engine_scripts/chromy/onReady.js @@ -0,0 +1,5 @@ +module.exports = function(chromy, scenario, vp) { + console.log('SCENARIO > ' + scenario.label); + require('./clickAndHoverHelper')(chromy, scenario); + // add more ready handlers here... +}; diff --git a/backstop_data/engine_scripts/cookies.json b/backstop_data/engine_scripts/cookies.json new file mode 100644 index 000000000..b59400d7e --- /dev/null +++ b/backstop_data/engine_scripts/cookies.json @@ -0,0 +1,14 @@ +[ + { + "domain": ".www.yourdomain.com", + "path": "/", + "name": "yourCookieName", + "value": "yourCookieValue", + "expirationDate": 1798790400, + "hostOnly": false, + "httpOnly": false, + "secure": false, + "session": false, + "sameSite": "no_restriction" + } +] diff --git a/backstop_data/engine_scripts/imageStub.jpg b/backstop_data/engine_scripts/imageStub.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3e526b4bbbc74ef5125cb58f7c8849497ef4fa83 GIT binary patch literal 2900 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 literal 0 HcmV?d00001 diff --git a/backstop_data/engine_scripts/puppet/clickAndHoverHelper.js b/backstop_data/engine_scripts/puppet/clickAndHoverHelper.js new file mode 100644 index 000000000..cfb9e8fb9 --- /dev/null +++ b/backstop_data/engine_scripts/puppet/clickAndHoverHelper.js @@ -0,0 +1,43 @@ +module.exports = async (page, scenario) => { + var hoverSelector = scenario.hoverSelectors || scenario.hoverSelector; + var clickSelector = scenario.clickSelectors || scenario.clickSelector; + var keyPressSelector = + scenario.keyPressSelectors || scenario.keyPressSelector; + var scrollToSelector = scenario.scrollToSelector; + var postInteractionWait = scenario.postInteractionWait; // selector [str] | ms [int] + + if (keyPressSelector) { + for (const keyPressSelectorItem of [].concat(keyPressSelector)) { + await page.waitFor(keyPressSelectorItem.selector); + await page.type( + keyPressSelectorItem.selector, + keyPressSelectorItem.keyPress + ); + } + } + + if (hoverSelector) { + for (const hoverSelectorIndex of [].concat(hoverSelector)) { + await page.waitFor(hoverSelectorIndex); + await page.hover(hoverSelectorIndex); + } + } + + if (clickSelector) { + for (const clickSelectorIndex of [].concat(clickSelector)) { + await page.waitFor(clickSelectorIndex); + await page.click(clickSelectorIndex); + } + } + + if (postInteractionWait) { + await page.waitFor(postInteractionWait); + } + + if (scrollToSelector) { + await page.waitFor(scrollToSelector); + await page.evaluate(scrollToSelector => { + document.querySelector(scrollToSelector).scrollIntoView(); + }, scrollToSelector); + } +}; diff --git a/backstop_data/engine_scripts/puppet/ignoreCSP.js b/backstop_data/engine_scripts/puppet/ignoreCSP.js new file mode 100644 index 000000000..e5a2d8cd8 --- /dev/null +++ b/backstop_data/engine_scripts/puppet/ignoreCSP.js @@ -0,0 +1,67 @@ +/** + * IGNORE CSP HEADERS + * Listen to all requests. If a request matches scenario.url + * then fetch the request again manually, strip out CSP headers + * and respond to the original request without CSP headers. + * Allows `ignoreHTTPSErrors: true` BUT... requires `debugWindow: true` + * + * see https://github.com/GoogleChrome/puppeteer/issues/1229#issuecomment-380133332 + * this is the workaround until Page.setBypassCSP lands... https://github.com/GoogleChrome/puppeteer/pull/2324 + * + * @param {REQUEST} request + * @return {VOID} + * + * Use this in an onBefore script E.G. + ``` + module.exports = async function(page, scenario) { + require('./removeCSP')(page, scenario); + } + ``` + * + */ + +const fetch = require('node-fetch'); +const https = require('https'); +const agent = new https.Agent({ + rejectUnauthorized: false, +}); + +module.exports = async function(page, scenario) { + const intercept = async (request, targetUrl) => { + const requestUrl = request.url(); + + // FIND TARGET URL REQUEST + if (requestUrl === targetUrl) { + const cookiesList = await page.cookies(requestUrl); + const cookies = cookiesList + .map(cookie => `${cookie.name}=${cookie.value}`) + .join('; '); + const headers = Object.assign(request.headers(), { cookie: cookies }); + const options = { + headers: headers, + body: request.postData(), + method: request.method(), + follow: 20, + agent, + }; + + const result = await fetch(requestUrl, options); + + const buffer = await result.buffer(); + let cleanedHeaders = result.headers._headers || {}; + cleanedHeaders['content-security-policy'] = ''; + await request.respond({ + body: buffer, + headers: cleanedHeaders, + status: result.status, + }); + } else { + request.continue(); + } + }; + + await page.setRequestInterception(true); + page.on('request', req => { + intercept(req, scenario.url); + }); +}; diff --git a/backstop_data/engine_scripts/puppet/interceptImages.js b/backstop_data/engine_scripts/puppet/interceptImages.js new file mode 100644 index 000000000..070f76441 --- /dev/null +++ b/backstop_data/engine_scripts/puppet/interceptImages.js @@ -0,0 +1,37 @@ +/** + * INTERCEPT IMAGES + * Listen to all requests. If a request matches IMAGE_URL_RE + * then stub the image with data from IMAGE_STUB_URL + * + * Use this in an onBefore script E.G. + ``` + module.exports = async function(page, scenario) { + require('./interceptImages')(page, scenario); + } + ``` + * + */ + +const fs = require('fs'); +const path = require('path'); + +const IMAGE_URL_RE = /\.gif|\.jpg|\.png/i; +const IMAGE_STUB_URL = path.resolve(__dirname, '../../imageStub.jpg'); +const IMAGE_DATA_BUFFER = fs.readFileSync(IMAGE_STUB_URL); +const HEADERS_STUB = {}; + +module.exports = async function(page, scenario) { + const intercept = async (request, targetUrl) => { + if (IMAGE_URL_RE.test(request.url())) { + await request.respond({ + body: IMAGE_DATA_BUFFER, + headers: HEADERS_STUB, + status: 200, + }); + } else { + request.continue(); + } + }; + await page.setRequestInterception(true); + page.on('request', intercept); +}; diff --git a/backstop_data/engine_scripts/puppet/loadCookies.js b/backstop_data/engine_scripts/puppet/loadCookies.js new file mode 100644 index 000000000..ce6cfe72b --- /dev/null +++ b/backstop_data/engine_scripts/puppet/loadCookies.js @@ -0,0 +1,29 @@ +var fs = require('fs'); + +module.exports = async (page, scenario) => { + var cookies = []; + var cookiePath = scenario.cookiePath; + + // READ COOKIES FROM FILE IF EXISTS + if (fs.existsSync(cookiePath)) { + cookies = JSON.parse(fs.readFileSync(cookiePath)); + } + + // MUNGE COOKIE DOMAIN + cookies = cookies.map(cookie => { + cookie.url = 'https://' + cookie.domain; + delete cookie.domain; + return cookie; + }); + + // SET COOKIES + const setCookies = async () => { + return Promise.all( + cookies.map(async cookie => { + await page.setCookie(cookie); + }) + ); + }; + await setCookies(); + console.log('Cookie state restored with:', JSON.stringify(cookies, null, 2)); +}; diff --git a/backstop_data/engine_scripts/puppet/onBefore.js b/backstop_data/engine_scripts/puppet/onBefore.js new file mode 100644 index 000000000..a1c374c37 --- /dev/null +++ b/backstop_data/engine_scripts/puppet/onBefore.js @@ -0,0 +1,3 @@ +module.exports = async (page, scenario, vp) => { + await require('./loadCookies')(page, scenario); +}; diff --git a/backstop_data/engine_scripts/puppet/onReady.js b/backstop_data/engine_scripts/puppet/onReady.js new file mode 100644 index 000000000..517c0e41b --- /dev/null +++ b/backstop_data/engine_scripts/puppet/onReady.js @@ -0,0 +1,6 @@ +module.exports = async (page, scenario, vp) => { + console.log('SCENARIO > ' + scenario.label); + await require('./clickAndHoverHelper')(page, scenario); + + // add more ready handlers here... +}; From 480736f67bedb2a3d61b03609a0c313aee030180 Mon Sep 17 00:00:00 2001 From: Yury Savin Date: Thu, 18 Apr 2019 06:27:38 +0300 Subject: [PATCH 3/5] =?UTF-8?q?=F0=9F=94=A7=20Configure=20backstopjs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backstop.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/backstop.json b/backstop.json index ccdf7831d..8166cc8f6 100644 --- a/backstop.json +++ b/backstop.json @@ -1,13 +1,13 @@ { - "id": "backstop_default", + "id": "bgu", "viewports": [ { - "label": "phone", + "label": "iphone5", "width": 320, - "height": 480 + "height": 568 }, { - "label": "tablet", + "label": "desktop", "width": 1024, "height": 768 } @@ -16,9 +16,9 @@ "onReadyScript": "puppet/onReady.js", "scenarios": [ { - "label": "BackstopJS Homepage", + "label": "Schedule", "cookiePath": "backstop_data/engine_scripts/cookies.json", - "url": "https://garris.github.io/BackstopJS/", + "url": "http://localhost:5000/36/17844/", "referenceUrl": "", "readyEvent": "", "readySelector": "", From b5ed7d776967c67b4675feb801126db63bbc5faf Mon Sep 17 00:00:00 2001 From: Yury Savin Date: Thu, 18 Apr 2019 06:28:05 +0300 Subject: [PATCH 4/5] =?UTF-8?q?=F0=9F=93=A6=20Add=20alias=20for=20backstop?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/package.json b/package.json index 9daef411e..5630eab0b 100644 --- a/package.json +++ b/package.json @@ -61,6 +61,9 @@ "lint": "eslint src/ --ext .js,.jsx,.ts,.tsx", "test": "react-app-rewired test", "test:coverage": "react-app-rewired test --coverage", + "serve": "serve -s build", + "backstop:test": "yarn backstop test", + "backstop:approve": "yarn backstop approve", "eject": "react-scripts eject", "updateSchedule": "ts-node --project scripts/tsconfig.json scripts/updateSchedule.ts", "commitSchedule": "git add public/data/ && git commit -m 'Update schedule'", From 4d656d56adfd547296c0974c45b812b1b15991db Mon Sep 17 00:00:00 2001 From: Yury Savin Date: Thu, 18 Apr 2019 06:28:45 +0300 Subject: [PATCH 5/5] First backstop approve --- .../bgu_Schedule_0_document_0_iphone5.png | Bin 0 -> 26464 bytes .../bgu_Schedule_0_document_1_desktop.png | Bin 0 -> 32533 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 backstop_data/bitmaps_reference/bgu_Schedule_0_document_0_iphone5.png create mode 100644 backstop_data/bitmaps_reference/bgu_Schedule_0_document_1_desktop.png diff --git a/backstop_data/bitmaps_reference/bgu_Schedule_0_document_0_iphone5.png b/backstop_data/bitmaps_reference/bgu_Schedule_0_document_0_iphone5.png new file mode 100644 index 0000000000000000000000000000000000000000..fd2ac2753fcd4ee6adc9209cbc24f6d9496efa70 GIT binary patch literal 26464 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 literal 0 HcmV?d00001 diff --git a/backstop_data/bitmaps_reference/bgu_Schedule_0_document_1_desktop.png b/backstop_data/bitmaps_reference/bgu_Schedule_0_document_1_desktop.png new file mode 100644 index 0000000000000000000000000000000000000000..7631a09942c0face0747b6218f496c1fd1bbc914 GIT binary patch literal 32533 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 V?epgLz9fG7!=8hb%w5jE{3pxgoTvZ* literal 0 HcmV?d00001