diff options
| author | Erik Larkö <erik@mullvad.net> | 2017-08-18 13:29:22 +0200 |
|---|---|---|
| committer | Erik Larkö <erik@mullvad.net> | 2017-08-18 13:29:22 +0200 |
| commit | 750d633006774154301fffaeb680b9eb4065c745 (patch) | |
| tree | 5bc58525834fa92ff625395953f880a5ae0fec3b | |
| parent | 61c56110c3c2d550966edab662405c2f6d84c05b (diff) | |
| parent | ca6a2f8965b517bd5d5df512796d4ceeda637d79 (diff) | |
| download | mullvadvpn-750d633006774154301fffaeb680b9eb4065c745.tar.xz mullvadvpn-750d633006774154301fffaeb680b9eb4065c745.zip | |
Merge branch 'login-failure-notification-test'
| -rw-r--r-- | flow-typed/npm/enzyme_v2.3.x.js | 85 | ||||
| -rw-r--r-- | package.json | 2 | ||||
| -rw-r--r-- | test/components/Login.spec.js | 64 | ||||
| -rw-r--r-- | yarn.lock | 203 |
4 files changed, 352 insertions, 2 deletions
diff --git a/flow-typed/npm/enzyme_v2.3.x.js b/flow-typed/npm/enzyme_v2.3.x.js new file mode 100644 index 0000000000..3898acbe2e --- /dev/null +++ b/flow-typed/npm/enzyme_v2.3.x.js @@ -0,0 +1,85 @@ +// flow-typed signature: 67cf88555a22019251c4870d6e78a462 +// flow-typed version: 60d0f06df5/enzyme_v2.3.x/flow_>=v0.28.x + +declare module 'enzyme' { + declare type PredicateFunction<T: Wrapper> = (wrapper: T, index: number) => boolean; + declare type NodeOrNodes = React$Element<any> | Array<React$Element<any>>; + declare type EnzymeSelector = string | ReactClass<any> | Object; + + // CheerioWrapper is a type alias for an actual cheerio instance + // TODO: Reference correct type from cheerio's type declarations + declare type CheerioWrapper = any; + + declare class Wrapper { + find(selector: EnzymeSelector): this; + findWhere(predicate: PredicateFunction<this>): this; + filter(selector: EnzymeSelector): this; + filterWhere(predicate: PredicateFunction<this>): this; + contains(nodeOrNodes: NodeOrNodes): boolean; + containsMatchingElement(node: React$Element<any>): boolean; + containsAllMatchingElements(nodes: NodeOrNodes): boolean; + containsAnyMatchingElements(nodes: NodeOrNodes): boolean; + dive(option?: { context?: Object }): this; + exists(): boolean; + matchesElement(node: React$Element<any>): boolean; + hasClass(className: string): boolean; + is(selector: EnzymeSelector): boolean; + isEmpty(): boolean; + not(selector: EnzymeSelector): this; + children(selector?: EnzymeSelector): this; + childAt(index: number): this; + parents(selector?: EnzymeSelector): this; + parent(): this; + closest(selector: EnzymeSelector): this; + render(): CheerioWrapper; + unmount(): this; + text(): string; + html(): string; + get(index: number): React$Element<any>; + getNode(): React$Element<any>; + getNodes(): Array<React$Element<any>>; + getDOMNode(): HTMLElement | HTMLInputElement; + at(index: number): this; + first(): this; + last(): this; + state(key?: string): any; + context(key?: string): any; + props(): Object; + prop(key: string): any; + key(): string; + simulate(event: string, ...args: Array<any>): this; + setState(state: {}, callback?: Function): this, + setProps(props: {}): this; + setContext(context: Object): this; + instance(): React$Component<*, *, *>; + update(): this; + debug(): string; + type(): string | Function | null; + name(): string; + forEach(fn: (node: this, index: number) => mixed): this; + map<T>(fn: (node: this, index: number) => T): Array<T>; + reduce<T>(fn: (value: T, node: this, index: number) => T, initialValue?: T): Array<T>; + reduceRight<T>(fn: (value: T, node: this, index: number) => T, initialValue?: T): Array<T>; + some(selector: EnzymeSelector): boolean; + someWhere(predicate: PredicateFunction<this>): boolean; + every(selector: EnzymeSelector): boolean; + everyWhere(predicate: PredicateFunction<this>): boolean; + length: number; + } + + declare export class ReactWrapper extends Wrapper { + constructor(nodes: NodeOrNodes, root: any, options?: ?Object): ReactWrapper; + mount(): this; + ref(refName: string): this; + detach(): void; + } + + declare export class ShallowWrapper extends Wrapper { + equals(node: React$Element<any>): boolean; + shallow(options?: { context?: Object }): ShallowWrapper; + } + + declare export function shallow(node: React$Element<any>, options?: { context?: Object }): ShallowWrapper; + declare export function mount(node: React$Element<any>, options?: { context?: Object, attachTo?: HTMLElement, childContextTypes?: Object }): ReactWrapper; + declare export function render(node: React$Element<any>, options?: { context?: Object }): CheerioWrapper; +} diff --git a/package.json b/package.json index 2d3f89e984..159de2f127 100644 --- a/package.json +++ b/package.json @@ -52,12 +52,14 @@ "electron-builder": "^19.12.0", "electron-devtools-installer": "^2.1.0", "electron-mocha": "^3.3.0", + "enzyme": "^2.9.1", "eslint": "^4.1.1", "eslint-plugin-flowtype": "^2.34.1", "eslint-plugin-react": "^7.1.0", "flow-bin": "^0.50.0", "flow-typed": "^2.1.5", "npm-run-all": "^4.0.1", + "react-test-renderer": "^15.6.1", "redux-mock-store": "^1.2.2", "rimraf": "^2.5.4" }, diff --git a/test/components/Login.spec.js b/test/components/Login.spec.js new file mode 100644 index 0000000000..0f82102d4e --- /dev/null +++ b/test/components/Login.spec.js @@ -0,0 +1,64 @@ +// @flow + +import { expect } from 'chai'; +import React from 'react'; +import { shallow } from 'enzyme'; +import Login from '../../app/components/Login'; +import AccountInput from '../../app/components/AccountInput'; + +import type { ShallowWrapper } from 'enzyme'; + +describe('components/Login', () => { + + it('notifies on the first change after failure', () => { + + let cbCalled = false; + const props = { + onFirstChangeAfterFailure: () => { cbCalled=true; }, + }; + + const component = renderWithProps( props ); + const accountInput = component.find(AccountInput); + + // Change the props to a failed state + component.setProps({ account: { + status: 'failed', + }}); + + + // Write something in the input field + setInputText(accountInput, 'foo'); + expect(cbCalled).to.be.true; + + + // Reset the test state + cbCalled = false; + + // Write some other thing in the input field + setInputText(accountInput, 'bar'); + expect(cbCalled).to.be.false; + }); + +}); + +function renderWithProps(customProps): ShallowWrapper { + const defaultProps = { + account: {accountNumber: null, + paidUntil: null, + status: 'none', + error: null, + }, + onLogin: () => {}, + onSettings: () => {}, + onChange: () => {}, + onFirstChangeAfterFailure: () => {}, + onExternalLink: () => {}, + }; + const props = Object.assign({}, defaultProps, customProps); + + return shallow( <Login { ...props } /> ); +} + +function setInputText(input: ShallowWrapper, text: string) { + input.simulate('change', {target: {value: text}}); +} @@ -1090,6 +1090,10 @@ bluebird@^3.4.6, bluebird@^3.4.7, bluebird@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" +boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + boom@2.x.x: version "2.10.1" resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" @@ -1359,6 +1363,27 @@ check-error@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" +cheerio@^0.22.0: + version "0.22.0" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.22.0.tgz#a9baa860a3f9b595a6b81b1a86873121ed3a269e" + dependencies: + css-select "~1.2.0" + dom-serializer "~0.1.0" + entities "~1.1.1" + htmlparser2 "^3.9.1" + lodash.assignin "^4.0.9" + lodash.bind "^4.1.4" + lodash.defaults "^4.0.1" + lodash.filter "^4.4.0" + lodash.flatten "^4.2.0" + lodash.foreach "^4.3.0" + lodash.map "^4.4.0" + lodash.merge "^4.4.0" + lodash.pick "^4.2.1" + lodash.reduce "^4.4.0" + lodash.reject "^4.4.0" + lodash.some "^4.4.0" + chokidar@1.7.0, chokidar@^1.6.1: version "1.7.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" @@ -1606,6 +1631,19 @@ crypto-random-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" +css-select@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" + dependencies: + boolbase "~1.0.0" + css-what "2.1" + domutils "1.5.1" + nth-check "~1.0.1" + +css-what@2.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd" + csso@~2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85" @@ -1759,6 +1797,34 @@ dom-helpers@^3.2.0: version "3.2.1" resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.2.1.tgz#3203e07fed217bd1f424b019735582fc37b2825a" +dom-serializer@0, dom-serializer@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" + dependencies: + domelementtype "~1.1.1" + entities "~1.1.1" + +domelementtype@1, domelementtype@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" + +domelementtype@~1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" + +domhandler@^2.3.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.1.tgz#892e47000a99be55bbf3774ffea0561d8879c259" + dependencies: + domelementtype "1" + +domutils@1.5.1, domutils@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" + dependencies: + dom-serializer "0" + domelementtype "1" + dot-prop@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.1.1.tgz#a8493f0b7b5eeec82525b5c7587fa7de7ca859c1" @@ -2012,17 +2078,36 @@ engine.io@1.8.0: engine.io-parser "1.3.1" ws "1.1.1" +entities@^1.1.1, entities@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" + env-paths@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-1.0.0.tgz#4168133b42bb05c38a35b1ae4397c8298ab369e0" +enzyme@^2.9.1: + version "2.9.1" + resolved "https://registry.yarnpkg.com/enzyme/-/enzyme-2.9.1.tgz#07d5ce691241240fb817bf2c4b18d6e530240df6" + dependencies: + cheerio "^0.22.0" + function.prototype.name "^1.0.0" + is-subset "^0.1.1" + lodash "^4.17.4" + object-is "^1.0.1" + object.assign "^4.0.4" + object.entries "^1.0.4" + object.values "^1.0.4" + prop-types "^15.5.10" + uuid "^3.0.1" + error-ex@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" dependencies: is-arrayish "^0.2.1" -es-abstract@^1.4.3: +es-abstract@^1.4.3, es-abstract@^1.6.1: version "1.7.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.7.0.tgz#dfade774e01bfcd97f96180298c449c8623fb94c" dependencies: @@ -2569,6 +2654,14 @@ function-bind@^1.0.2, function-bind@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771" +function.prototype.name@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.0.3.tgz#0099ae5572e9dd6f03c97d023fd92bcc5e639eac" + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.0" + is-callable "^1.1.3" + gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" @@ -2867,6 +2960,17 @@ hosted-git-info@^2.1.4, hosted-git-info@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" +htmlparser2@^3.9.1: + version "3.9.2" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb00b338" + dependencies: + domelementtype "^1.3.0" + domhandler "^2.3.0" + domutils "^1.5.1" + entities "^1.1.1" + inherits "^2.0.1" + readable-stream "^2.0.2" + http-errors@~1.5.0: version "1.5.1" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.5.1.tgz#788c0d2c1de2c81b9e6e8c01843b6b97eb920750" @@ -3157,6 +3261,10 @@ is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" +is-subset@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6" + is-symbol@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" @@ -3415,6 +3523,14 @@ lodash.assign@^4.0.3, lodash.assign@^4.0.6: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" +lodash.assignin@^4.0.9: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2" + +lodash.bind@^4.1.4: + version "4.2.1" + resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35" + lodash.create@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" @@ -3423,6 +3539,22 @@ lodash.create@3.1.1: lodash._basecreate "^3.0.0" lodash._isiterateecall "^3.0.0" +lodash.defaults@^4.0.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" + +lodash.filter@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace" + +lodash.flatten@^4.2.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + +lodash.foreach@^4.3.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" + lodash.isarguments@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" @@ -3447,6 +3579,30 @@ lodash.keys@^3.0.0: lodash.isarguments "^3.0.0" lodash.isarray "^3.0.0" +lodash.map@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" + +lodash.merge@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.0.tgz#69884ba144ac33fe699737a6086deffadd0f89c5" + +lodash.pick@^4.2.1: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" + +lodash.reduce@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b" + +lodash.reject@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.reject/-/lodash.reject-4.6.0.tgz#80d6492dc1470864bbf583533b651f42a9f52415" + +lodash.some@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" + lodash@^3.10.1: version "3.10.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" @@ -3821,6 +3977,12 @@ npmlog@^4.0.2: dependencies: bindings "^1.2.1" +nth-check@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4" + dependencies: + boolbase "~1.0.0" + nugget@^2.0.0, nugget@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/nugget/-/nugget-2.0.1.tgz#201095a487e1ad36081b3432fa3cada4f8d071b0" @@ -3857,7 +4019,11 @@ object-inspect@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-0.4.0.tgz#f5157c116c1455b243b06ee97703392c5ad89fec" -object-keys@^1.0.6, object-keys@^1.0.8: +object-is@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.1.tgz#0aa60ec9989a0b3ed795cf4d06f62cf1ad6539b6" + +object-keys@^1.0.10, object-keys@^1.0.6, object-keys@^1.0.8: version "1.0.11" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" @@ -3869,6 +4035,23 @@ object-path@^0.9.0: version "0.9.2" resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.9.2.tgz#0fd9a74fc5fad1ae3968b586bda5c632bd6c05a5" +object.assign@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.0.4.tgz#b1c9cc044ef1b9fe63606fc141abbb32e14730cc" + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.0" + object-keys "^1.0.10" + +object.entries@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.0.4.tgz#1bf9a4dd2288f5b33f3a993d257661f05d161a5f" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.6.1" + function-bind "^1.1.0" + has "^1.0.1" + object.omit@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" @@ -3876,6 +4059,15 @@ object.omit@^2.0.0: for-own "^0.1.4" is-extendable "^0.1.1" +object.values@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.0.4.tgz#e524da09b4f66ff05df457546ec72ac99f13069a" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.6.1" + function-bind "^1.1.0" + has "^1.0.1" + on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" @@ -4368,6 +4560,13 @@ react-router@^4.1.1: prop-types "^15.5.4" warning "^3.0.0" +react-test-renderer@^15.6.1: + version "15.6.1" + resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-15.6.1.tgz#026f4a5bb5552661fd2cc4bbcd0d4bc8a35ebf7e" + dependencies: + fbjs "^0.8.9" + object-assign "^4.1.0" + react-transition-group@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-1.2.0.tgz#b51fc921b0c3835a7ef7c571c79fc82c73e9204f" |
