Skip to content

Commit

Permalink
immer provision (keybase#20969)
Browse files Browse the repository at this point in the history
  • Loading branch information
chrisnojima authored Nov 22, 2019
1 parent 7d69673 commit 60502a6
Show file tree
Hide file tree
Showing 27 changed files with 427 additions and 430 deletions.
2 changes: 1 addition & 1 deletion protocol/bin/flow.js
Original file line number Diff line number Diff line change
Expand Up @@ -488,7 +488,7 @@ export type String = string
export type Uint = number
export type Uint64 = number
type WaitingKey = string | Array<string>
export type IncomingErrorCallback = (err: {code?: number, desc?: string} | null) => void
export type IncomingErrorCallback = (err?: {code?: number, desc?: string} | null) => void
type IncomingReturn = Effect | null | void | false | Array<Effect | null | void | false>
// Dummy calls to avoid undelcared warnings in TS strict mode
Expand Down
45 changes: 24 additions & 21 deletions shared/actions/__tests__/add-new-device.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -101,8 +101,8 @@ describe('text code happy path', () => {

it('init', () => {
const {manager, response, getState} = init
expect(manager._stashedResponse).toEqual(response)
expect(manager._stashedResponseKey).toEqual('keybase.1.provisionUi.DisplayAndPromptSecret')
const _testing = manager._testing()
expect(_testing.stashedResponse['keybase.1.provisionUi.DisplayAndPromptSecret']).toEqual(response)
expect(getState().provision.codePageIncomingTextCode).toEqual(incoming)
expect(getState().provision.error).toEqual(noError)
})
Expand All @@ -115,14 +115,14 @@ describe('text code happy path', () => {
it('submit text code empty throws', () => {
const {dispatch, response} = init
dispatch(ProvisionGen.createSubmitTextCode({phrase: new HiddenString('')}))
expect(response.result).not.toHaveBeenCalled()
expect(response.error).toHaveBeenCalled()
expect(response.result).toHaveBeenCalledWith({phrase: 'invalid', secret: null})
expect(response.error).not.toHaveBeenCalled()
})

it('submit text code', () => {
const {response, dispatch, getState} = init
dispatch(ProvisionGen.createSubmitTextCode({phrase: outgoing}))
expect(response.result).toHaveBeenCalledWith({code: null, phrase: outgoing.stringValue()})
expect(response.result).toHaveBeenCalledWith({phrase: outgoing.stringValue(), secret: null})
expect(response.error).not.toHaveBeenCalled()
expect(getState().provision.codePageOutgoingTextCode).toEqual(outgoing)
expect(getState().provision.error).toEqual(noError)
Expand All @@ -147,8 +147,8 @@ describe('text code error path', () => {

it('init', () => {
const {manager, response, getState} = init
expect(manager._stashedResponse).toEqual(response)
expect(manager._stashedResponseKey).toEqual('keybase.1.provisionUi.DisplayAndPromptSecret')
const _testing = manager._testing()
expect(_testing.stashedResponse['keybase.1.provisionUi.DisplayAndPromptSecret']).toEqual(response)
expect(getState().provision.codePageIncomingTextCode).toEqual(phrase)
expect(getState().provision.error).toEqual(error)
})
Expand All @@ -164,7 +164,7 @@ describe('text code error path', () => {
dispatch(ProvisionGen.createSubmitTextCode({phrase: reply}))
expect(getState().provision.error).toEqual(noError)

expect(response.result).toHaveBeenCalledWith({code: null, phrase: reply.stringValue()})
expect(response.result).toHaveBeenCalledWith({phrase: reply.stringValue(), secret: null})
expect(response.error).not.toHaveBeenCalled()
expect(getState().config.globalError).toEqual(undefined)

Expand All @@ -179,33 +179,35 @@ describe('reply with device type', () => {
it('init with mobile', () => {
const {manager, response} = makeInit({
initialStore: {
provision: Constants.makeState({
codePageOtherDevice: Constants.makeDevice({type: 'mobile'}),
}),
provision: {
...Constants.makeState(),
codePageOtherDevice: {...Constants.makeDevice(), type: 'mobile'},
},
},
method: 'keybase.1.provisionUi.chooseDeviceType',
payload: {},
})
// we don't stash we reply immediately
expect(manager._stashedResponse).toEqual(null)
expect(manager._stashedResponseKey).toEqual(null)
const _testing = manager._testing()
expect(_testing.stashedResponse).toEqual({})
expect(response.result).toHaveBeenCalledWith(RPCTypes.DeviceType.mobile)
expect(response.error).not.toHaveBeenCalled()
})

it('init with desktop', () => {
const {manager, response} = makeInit({
initialStore: {
provision: Constants.makeState({
codePageOtherDevice: Constants.makeDevice({type: 'desktop'}),
}),
provision: {
...Constants.makeState(),
codePageOtherDevice: {...Constants.makeDevice(), type: 'desktop'},
},
},
method: 'keybase.1.provisionUi.chooseDeviceType',
payload: {},
})
// we don't stash we reply immediately
expect(manager._stashedResponse).toEqual(null)
expect(manager._stashedResponseKey).toEqual(null)
const _testing = manager._testing()
expect(_testing.stashedResponse).toEqual({})
expect(response.result).toHaveBeenCalledWith(RPCTypes.DeviceType.desktop)
expect(response.error).not.toHaveBeenCalled()
})
Expand All @@ -214,9 +216,10 @@ describe('reply with device type', () => {
expect(() =>
makeInit({
initialStore: {
provision: Constants.makeState({
codePageOtherDevice: Constants.makeDevice({type: 'backup'}),
}),
provision: {
...Constants.makeState(),
codePageOtherDevice: {...Constants.makeDevice(), type: 'backup'},
},
},
method: 'keybase.1.provisionUi.chooseDeviceType',
payload: {},
Expand Down
91 changes: 33 additions & 58 deletions shared/actions/__tests__/provision.test.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
/* eslint-env jest */
import * as I from 'immutable'
import * as RPCTypes from '../../constants/types/rpc-gen'
import * as Constants from '../../constants/provision'
import * as Tabs from '../../constants/tabs'
Expand Down Expand Up @@ -43,6 +42,7 @@ const makeInit = ({method, payload, initialStore}: {method: string; payload: any
}
}
return {
_testing: manager._testing(),
dispatch,
getState,
manager,
Expand Down Expand Up @@ -92,7 +92,7 @@ describe('provisioningManagerProvisioning', () => {
describe('text code happy path', () => {
const incoming = new HiddenString('incomingSecret')
const outgoing = new HiddenString('outgoingSecret')
let init
let init: ReturnType<typeof makeInit>
beforeEach(() => {
init = makeInit({
method: 'keybase.1.provisionUi.DisplayAndPromptSecret',
Expand All @@ -101,9 +101,8 @@ describe('text code happy path', () => {
})

it('init', () => {
const {manager, response, getState} = init
expect(manager._stashedResponse).toEqual(response)
expect(manager._stashedResponseKey).toEqual('keybase.1.provisionUi.DisplayAndPromptSecret')
const {_testing, response, getState} = init
expect(_testing.stashedResponse['keybase.1.provisionUi.DisplayAndPromptSecret']).toEqual(response)
expect(getState().provision.codePageIncomingTextCode).toEqual(incoming)
expect(getState().provision.error).toEqual(noError)
})
Expand All @@ -116,8 +115,8 @@ describe('text code happy path', () => {
it('submit text code empty throws', () => {
const {dispatch, response} = init
dispatch(ProvisionGen.createSubmitTextCode({phrase: new HiddenString('')}))
expect(response.result).not.toHaveBeenCalled()
expect(response.error).toHaveBeenCalled()
expect(response.result).toHaveBeenCalledWith({phrase: 'invalid', secret: null})
expect(response.error).not.toHaveBeenCalled()
})

it('submit text code with spaces works', () => {
Expand All @@ -129,14 +128,14 @@ describe('text code happy path', () => {
)
const good = 'this is a text code that works'
expect(getState().provision.codePageOutgoingTextCode.stringValue()).toEqual(good)
expect(response.result).toHaveBeenCalledWith({code: null, phrase: good})
expect(response.result).toHaveBeenCalledWith({phrase: good, secret: null})
expect(response.error).not.toHaveBeenCalled()
})

it('submit text code', () => {
const {response, dispatch, getState} = init
dispatch(ProvisionGen.createSubmitTextCode({phrase: outgoing}))
expect(response.result).toHaveBeenCalledWith({code: null, phrase: outgoing.stringValue()})
expect(response.result).toHaveBeenCalledWith({phrase: outgoing.stringValue(), secret: null})
expect(response.error).not.toHaveBeenCalled()
expect(getState().provision.codePageOutgoingTextCode).toEqual(outgoing)
expect(getState().provision.error).toEqual(noError)
Expand All @@ -151,7 +150,7 @@ describe('text code happy path', () => {
describe('text code error path', () => {
const phrase = new HiddenString('incomingSecret')
const error = new HiddenString('anerror')
let init
let init: ReturnType<typeof makeInit>
beforeEach(() => {
init = makeInit({
method: 'keybase.1.provisionUi.DisplayAndPromptSecret',
Expand All @@ -160,9 +159,8 @@ describe('text code error path', () => {
})

it('init', () => {
const {manager, response, getState} = init
expect(manager._stashedResponse).toEqual(response)
expect(manager._stashedResponseKey).toEqual('keybase.1.provisionUi.DisplayAndPromptSecret')
const {_testing, response, getState} = init
expect(_testing.stashedResponse['keybase.1.provisionUi.DisplayAndPromptSecret']).toEqual(response)
expect(getState().provision.codePageIncomingTextCode).toEqual(phrase)
expect(getState().provision.error).toEqual(error)
})
Expand All @@ -178,7 +176,7 @@ describe('text code error path', () => {
dispatch(ProvisionGen.createSubmitTextCode({phrase: reply}))
expect(getState().provision.error).toEqual(noError)

expect(response.result).toHaveBeenCalledWith({code: null, phrase: reply.stringValue()})
expect(response.result).toHaveBeenCalledWith({phrase: reply.stringValue(), secret: null})
expect(response.error).not.toHaveBeenCalled()
expect(getState().config.globalError).toEqual(undefined)

Expand All @@ -189,7 +187,7 @@ describe('text code error path', () => {
})

describe('device name empty', () => {
const existingDevices = I.List()
const existingDevices = []
const init = makeInit({
method: 'keybase.1.provisionUi.PromptNewDeviceName',
payload: {errorMessage: '', existingDevices: null},
Expand All @@ -201,12 +199,12 @@ describe('device name empty', () => {
})

describe('device name happy path', () => {
const existingDevices = I.List(['dev1', 'dev2', 'dev3'])
let init
const existingDevices = ['dev1', 'dev2', 'dev3']
let init: ReturnType<typeof makeInit>
beforeEach(() => {
init = makeInit({
method: 'keybase.1.provisionUi.PromptNewDeviceName',
payload: {errorMessage: '', existingDevices: existingDevices.toArray()},
payload: {errorMessage: '', existingDevices: existingDevices},
})
})

Expand Down Expand Up @@ -235,13 +233,13 @@ describe('device name happy path', () => {
})

describe('device name error path', () => {
const existingDevices = I.List([])
const existingDevices = []
const error = new HiddenString('invalid name')
let init
let init: ReturnType<typeof makeInit>
beforeEach(() => {
init = makeInit({
method: 'keybase.1.provisionUi.PromptNewDeviceName',
payload: {errorMessage: error.stringValue(), existingDevices: existingDevices.toArray()},
payload: {errorMessage: error.stringValue(), existingDevices: existingDevices},
})
})

Expand Down Expand Up @@ -276,8 +274,8 @@ describe('other device happy path', () => {
const desktop = {deviceID: '1', name: 'desktop', type: 'desktop'} as any
const backup = {deviceID: '2', name: 'backup', type: 'backup'} as any
const rpcDevices = [mobile, desktop, backup]
const devices = I.List(rpcDevices.map(Constants.rpcDeviceToDevice))
let init
const devices = rpcDevices.map(Constants.rpcDeviceToDevice)
let init: ReturnType<typeof makeInit>
beforeEach(() => {
init = makeInit({
method: 'keybase.1.provisionUi.chooseDevice',
Expand Down Expand Up @@ -348,7 +346,7 @@ describe('other device happy path', () => {
})

describe('other device error path', () => {
let init
let init: ReturnType<typeof makeInit>
beforeEach(() => {
// daemon should never do this
init = makeInit({
Expand All @@ -359,13 +357,13 @@ describe('other device error path', () => {

it('init', () => {
const {getState} = init
expect(getState().provision.devices).toEqual(I.List([]))
expect(getState().provision.devices).toEqual([])
expect(getState().provision.error).toEqual(noError)
})
})

describe('other device no devices', () => {
let init
let init: ReturnType<typeof makeInit>
const rpcDevices = null
beforeEach(() => {
init = makeInit({
Expand All @@ -376,13 +374,13 @@ describe('other device no devices', () => {

it('init', () => {
const {getState} = init
expect(getState().provision.devices).toEqual(I.List())
expect(getState().provision.devices).toEqual([])
expect(getState().provision.error).toEqual(noError)
})
})

describe('choose gpg happy path', () => {
let init
let init: ReturnType<typeof makeInit>
beforeEach(() => {
init = makeInit({
method: 'keybase.1.provisionUi.chooseGPGMethod',
Expand Down Expand Up @@ -435,7 +433,7 @@ describe('choose gpg happy path', () => {
})

describe('password happy path', () => {
let init
let init: ReturnType<typeof makeInit>
beforeEach(() => {
init = makeInit({
method: 'keybase.1.secretUi.getPassphrase',
Expand Down Expand Up @@ -474,7 +472,7 @@ describe('password happy path', () => {

describe('passphrase error path', () => {
const error = new HiddenString('invalid passphrase')
let init
let init: ReturnType<typeof makeInit>
beforeEach(() => {
init = makeInit({
method: 'keybase.1.secretUi.getPassphrase',
Expand Down Expand Up @@ -513,7 +511,7 @@ describe('passphrase error path', () => {
})

describe('paperkey happy path', () => {
let init
let init: ReturnType<typeof makeInit>
beforeEach(() => {
init = makeInit({
method: 'keybase.1.secretUi.getPassphrase',
Expand Down Expand Up @@ -552,7 +550,7 @@ describe('paperkey happy path', () => {

describe('paperkey error path', () => {
const error = new HiddenString('invalid paperkey')
let init
let init: ReturnType<typeof makeInit>
beforeEach(() => {
init = makeInit({
method: 'keybase.1.secretUi.getPassphrase',
Expand Down Expand Up @@ -638,7 +636,7 @@ describe('Submit user email', () => {
dispatch(action)
expect(getState().provision.username).toEqual(action.payload.username)
expect(getState().provision.error).toEqual(noError)
expect(getState().provision.finalError).toEqual(null)
expect(getState().provision.finalError).toEqual(undefined)
})

describe('generic errors show', () => {
Expand All @@ -663,7 +661,7 @@ describe('final errors show', () => {
const {getState, dispatch} = startReduxSaga()
const error = new RPCError('Input canceled', RPCTypes.StatusCode.scinputcanceled)
dispatch(ProvisionGen.createShowFinalErrorPage({finalError: error, fromDeviceAdd: false}))
expect(getState().provision.finalError).toEqual(null)
expect(getState().provision.finalError).toEqual(undefined)
// expect(getRoutePath()).toEqual(I.List([Tabs.loginTab]))
})

Expand All @@ -684,7 +682,7 @@ describe('final errors show', () => {
dispatch(RouteTreeGen.createNavigateAppend({path: [Tabs.devicesTab]}))
const error = new RPCError('Input canceled', RPCTypes.StatusCode.scinputcanceled)
dispatch(ProvisionGen.createShowFinalErrorPage({finalError: error, fromDeviceAdd: true}))
expect(getState().provision.finalError).toEqual(null)
expect(getState().provision.finalError).toEqual(undefined)
// expect(getRoutePath()).toEqual(I.List([Tabs.devicesTab]))
})
})
Expand All @@ -694,26 +692,3 @@ describe('reset works', () => {
dispatch({payload: {}, type: 'common:resetStore'})
expect(getState().provision).toEqual(Constants.makeState())
})

describe('manager', () => {
it('complains about invalid response key', () => {
const manager = _testing.makeProvisioningManager(false)
const stashed = () => {
console.log('whu')
}
manager._stashResponse('keybase.1.gpgUi.selectKey', stashed)
expect(() => manager._getAndClearResponse('keybase.1.loginUi.getEmailOrUsername')).toThrow()
})
it('complains about no response key', () => {
const manager = _testing.makeProvisioningManager(false)
expect(() => manager._getAndClearResponse('keybase.1.loginUi.getEmailOrUsername')).toThrow()
})
it('stashing works', () => {
const manager = _testing.makeProvisioningManager(false)
const stashed = () => {
console.log('whu')
}
manager._stashResponse('keybase.1.gpgUi.selectKey', stashed)
expect(manager._getAndClearResponse('keybase.1.gpgUi.selectKey')).toEqual(stashed)
})
})
Loading

0 comments on commit 60502a6

Please sign in to comment.