Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
thalia
ThaliApp
Commits
c70bf244
Commit
c70bf244
authored
Aug 29, 2018
by
Gijs Hendriksen
Browse files
Merge branch 'feature/react-navigation' into 'master'
Refactor to React Navigation instead of own ReduxNavigator Closes #47 See merge request
!186
parents
8c3dc976
16b867de
Changes
89
Hide whitespace changes
Inline
Side-by-side
.gitlab-ci.yml
View file @
c70bf244
...
...
@@ -67,5 +67,6 @@ build android:
-
./gradlew --no-daemon ":app:assemble"
artifacts
:
paths
:
-
$CI_PROJECT_DIR/android/app/build/outputs/apk/app-debug.apk
-
$CI_PROJECT_DIR/android/app/build/outputs/apk/app-release.apk
\ No newline at end of file
-
$CI_PROJECT_DIR/android/app/build/outputs/apk/debug/app-debug.apk
-
$CI_PROJECT_DIR/android/app/build/outputs/apk/release/app-release-unsigned.apk
-
$CI_PROJECT_DIR/android/app/build/outputs/apk/release/app-release.apk
\ No newline at end of file
__tests__/actions/__snapshots__/navigation.spec.js.snap
deleted
100644 → 0
View file @
8c3dc976
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`navigation actions should create an action to navigate back 1`] = `
Object {
"type": "NAVIGATE_BACK",
}
`;
exports[`navigation actions should create an action to navigate to a screen 1`] = `
Object {
"payload": Object {
"newSection": false,
"scene": "scene",
},
"type": "NAVIGATE_NAVIGATE",
}
`;
exports[`navigation actions should create an action to navigate to a screen 2`] = `
Object {
"payload": Object {
"newSection": true,
"scene": "scene",
},
"type": "NAVIGATE_NAVIGATE",
}
`;
exports[`navigation actions should create an action to update the drawer state 1`] = `
Object {
"payload": Object {
"drawerOpen": "state",
},
"type": "NAVIGATE_OPENDRAWER",
}
`;
__tests__/actions/__snapshots__/profile.spec.js.snap
View file @
c70bf244
...
...
@@ -24,8 +24,7 @@ Object {
exports[`navigation actions should create an action to load a profile 1`] = `
Object {
"payload": Object {
"member": "me",
"token": "token",
"member": "token",
},
"type": "PROFILE_PROFILE",
}
...
...
@@ -34,8 +33,7 @@ Object {
exports[`navigation actions should create an action to load a profile 2`] = `
Object {
"payload": Object {
"member": 1,
"token": "abc123",
"member": "abc123",
},
"type": "PROFILE_PROFILE",
}
...
...
__tests__/actions/__snapshots__/session.spec.js.snap
View file @
c70bf244
...
...
@@ -6,17 +6,13 @@ Object {
"token": "token",
"username": "username",
},
"type": "SESSION_S
UCCESS
",
"type": "SESSION_S
IGNED_IN
",
}
`;
exports[`session actions should create an action
for a successful user profile load
1`] = `
exports[`session actions should create an action
to fetch user info
1`] = `
Object {
"payload": Object {
"displayName": "displayName",
"photo": "photo",
},
"type": "SESSION_PROFILE_SUCCESS",
"type": "SESSION_FETCH_USER_INFO",
}
`;
...
...
@@ -26,28 +22,19 @@ Object {
}
`;
exports[`session actions should create an action to load the user profile 1`] = `
Object {
"payload": Object {
"token": "token",
},
"type": "SESSION_PROFILE",
}
`;
exports[`session actions should create an action to log the user in 1`] = `
Object {
"payload": Object {
"pass": "password",
"user": "username",
},
"type": "SESSION_
LOG
IN",
"type": "SESSION_
SIGN_
IN",
}
`;
exports[`session actions should create an action to log the user out 1`] = `
Object {
"type": "SESSION_
LOG
OUT",
"type": "SESSION_
SIGN_
OUT",
}
`;
...
...
@@ -56,3 +43,13 @@ Object {
"type": "SESSION_TOKEN_INVALID",
}
`;
exports[`session actions should create an action to set user info 1`] = `
Object {
"payload": Object {
"displayName": "displayName",
"photo": "photo",
},
"type": "SESSION_SET_USER_INFO",
}
`;
__tests__/actions/navigation.spec.js
deleted
100644 → 0
View file @
8c3dc976
import
*
as
actions
from
'
../../app/actions/navigation
'
;
describe
(
'
navigation actions
'
,
()
=>
{
it
(
'
should expose the navigation actions
'
,
()
=>
{
expect
(
actions
.
NAVIGATE
).
toEqual
(
'
NAVIGATE_NAVIGATE
'
);
expect
(
actions
.
BACK
).
toEqual
(
'
NAVIGATE_BACK
'
);
expect
(
actions
.
OPENDRAWER
).
toEqual
(
'
NAVIGATE_OPENDRAWER
'
);
});
it
(
'
should create an action to navigate to a screen
'
,
()
=>
{
expect
(
actions
.
navigate
(
'
scene
'
)).
toMatchSnapshot
();
expect
(
actions
.
navigate
(
'
scene
'
,
true
)).
toMatchSnapshot
();
});
it
(
'
should create an action to navigate back
'
,
()
=>
{
expect
(
actions
.
back
()).
toMatchSnapshot
();
});
it
(
'
should create an action to update the drawer state
'
,
()
=>
{
expect
(
actions
.
updateDrawer
(
'
state
'
)).
toMatchSnapshot
();
});
});
\ No newline at end of file
__tests__/actions/session.spec.js
View file @
c70bf244
...
...
@@ -3,12 +3,12 @@ import * as actions from '../../app/actions/session';
describe
(
'
session actions
'
,
()
=>
{
it
(
'
should expose the session actions
'
,
()
=>
{
expect
(
actions
.
INIT
).
toEqual
(
'
SESSION_INIT
'
);
expect
(
actions
.
S
UCCESS
).
toEqual
(
'
SESSION_S
UCCESS
'
);
expect
(
actions
.
LOG
IN
).
toEqual
(
'
SESSION_
LOG
IN
'
);
expect
(
actions
.
S
IGNED_IN
).
toEqual
(
'
SESSION_S
IGNED_IN
'
);
expect
(
actions
.
SIGN_
IN
).
toEqual
(
'
SESSION_
SIGN_
IN
'
);
expect
(
actions
.
TOKEN_INVALID
).
toEqual
(
'
SESSION_TOKEN_INVALID
'
);
expect
(
actions
.
LOG
OUT
).
toEqual
(
'
SESSION_
LOG
OUT
'
);
expect
(
actions
.
PROFILE
).
toEqual
(
'
SESSION_
PROFILE
'
);
expect
(
actions
.
PROFILE_SUCCESS
).
toEqual
(
'
SESSION_
PROFILE_SUCCESS
'
);
expect
(
actions
.
SIGN_
OUT
).
toEqual
(
'
SESSION_
SIGN_
OUT
'
);
expect
(
actions
.
FETCH_USER_INFO
).
toEqual
(
'
SESSION_
FETCH_USER_INFO
'
);
expect
(
actions
.
SET_USER_INFO
).
toEqual
(
'
SESSION_
SET_USER_INFO
'
);
});
it
(
'
should create an action to init the session
'
,
()
=>
{
...
...
@@ -20,22 +20,22 @@ describe('session actions', () => {
});
it
(
'
should create an action to log the user in
'
,
()
=>
{
expect
(
actions
.
logi
n
(
'
username
'
,
'
password
'
)).
toMatchSnapshot
();
expect
(
actions
.
signI
n
(
'
username
'
,
'
password
'
)).
toMatchSnapshot
();
});
it
(
'
should create an action for a successful login
'
,
()
=>
{
expect
(
actions
.
s
uccess
(
'
username
'
,
'
token
'
)).
toMatchSnapshot
();
expect
(
actions
.
s
ignedIn
(
'
username
'
,
'
token
'
)).
toMatchSnapshot
();
});
it
(
'
should create an action to log the user out
'
,
()
=>
{
expect
(
actions
.
logo
ut
()).
toMatchSnapshot
();
expect
(
actions
.
signO
ut
()).
toMatchSnapshot
();
});
it
(
'
should create an action to
load the user profile
'
,
()
=>
{
expect
(
actions
.
profile
(
'
token
'
)).
toMatchSnapshot
();
it
(
'
should create an action to
fetch user info
'
,
()
=>
{
expect
(
actions
.
fetchUserInfo
(
)).
toMatchSnapshot
();
});
it
(
'
should create an action
for a successful user profile load
'
,
()
=>
{
expect
(
actions
.
profileSuccess
(
'
displayName
'
,
'
photo
'
)).
toMatchSnapshot
();
it
(
'
should create an action
to set user info
'
,
()
=>
{
expect
(
actions
.
setUserInfo
(
'
displayName
'
,
'
photo
'
)).
toMatchSnapshot
();
});
});
\ No newline at end of file
__tests__/sagas/calendar.spec.js
View file @
c70bf244
...
...
@@ -7,8 +7,6 @@ import { apiRequest, tokenSelector } from '../../app/utils/url';
import
calendarSaga
from
'
../../app/sagas/calendar
'
;
import
*
as
calendarActions
from
'
../../app/actions/calendar
'
;
import
*
as
navActions
from
'
../../app/actions/navigation
'
;
import
{
EVENT_LIST_SCENE
}
from
'
../../app/ui/components/navigator/scenes
'
;
jest
.
mock
(
'
../../app/utils/url
'
,
()
=>
({
apiRequest
:
jest
.
fn
(()
=>
{}),
...
...
@@ -27,15 +25,6 @@ describe('calendar saga', () => {
.
put
(
calendarActions
.
fetching
())
.
silentRun
());
it
(
'
should start fetching on navigate
'
,
()
=>
expectSaga
(
calendarSaga
)
.
provide
([
[
select
(
tokenSelector
),
'
token
'
],
[
matchers
.
call
.
fn
(
apiRequest
),
[]],
])
.
dispatch
(
navActions
.
navigate
(
EVENT_LIST_SCENE
))
.
put
(
calendarActions
.
fetching
())
.
silentRun
());
it
(
'
should put an error when the api request fails
'
,
()
=>
expectSaga
(
calendarSaga
)
.
provide
([
[
select
(
tokenSelector
),
'
token
'
],
...
...
__tests__/sagas/deepLinking.spec.js
View file @
c70bf244
import
*
as
matchers
from
'
redux-saga-test-plan/matchers
'
;
import
{
select
}
from
'
redux-saga/effects
'
;
import
{
expectSaga
}
from
'
redux-saga-test-plan
'
;
import
deepLinkingSaga
,
{
parseURL
}
from
'
../../app/sagas/deepLinking
'
;
import
*
as
deepLinkingActions
from
'
../../app/actions/deepLinking
'
;
import
{
url
as
siteURL
,
apiRequest
,
loggedInSelector
}
from
'
../../app/utils/url
'
;
import
*
as
navigationActions
from
'
../../app/actions/navigation
'
;
import
*
as
eventActions
from
'
../../app/actions/event
'
;
import
*
as
loginActions
from
'
../../app/actions/session
'
;
import
*
as
pizzaActions
from
'
../../app/actions/pizza
'
;
import
{
EVENT_LIST_SCENE
}
from
'
../../app/ui/components/navigator/scenes
'
;
import
{
parseURL
}
from
'
../../app/sagas/deepLinking
'
;
import
{
url
as
siteURL
}
from
'
../../app/utils/url
'
;
describe
(
'
calendar saga
'
,
()
=>
{
jest
.
mock
(
'
../../app/navigation
'
,
()
=>
({
navigate
:
jest
.
fn
(),
}));
describe
(
'
deeplinking saga
'
,
()
=>
{
it
(
'
should parse a URL correctly
'
,
()
=>
{
const
eventsUrl
=
parseURL
(
`
${
siteURL
}
/events/1`
);
expect
(
eventsUrl
).
toEqual
({
params
:
{},
path
:
'
/events/1
'
});
...
...
@@ -19,46 +14,4 @@ describe('calendar saga', () => {
const
emptyUrl
=
parseURL
(
'
http://example.org/
'
);
expect
(
emptyUrl
).
toEqual
({
params
:
{},
path
:
''
});
});
it
(
'
should not do anything when no url is provided
'
,
()
=>
expectSaga
(
deepLinkingSaga
)
.
dispatch
(
deepLinkingActions
.
deepLink
(
''
))
.
not
.
put
.
like
({
type
:
'
DEEPLINKING_DEEPLINK
'
})
.
silentRun
());
it
(
'
should wait for login before processing deeplink
'
,
()
=>
expectSaga
(
deepLinkingSaga
)
.
provide
([
[
select
(
loggedInSelector
),
false
],
[
matchers
.
call
.
fn
(
apiRequest
),
[]],
])
.
dispatch
(
deepLinkingActions
.
deepLink
(
`
${
siteURL
}
/events/1/`
))
.
dispatch
(
loginActions
.
success
(
''
,
''
))
.
put
(
eventActions
.
event
(
'
1
'
))
.
silentRun
());
it
(
'
should navigate to eventList on /events/ deeplink
'
,
()
=>
expectSaga
(
deepLinkingSaga
)
.
provide
([
[
select
(
loggedInSelector
),
true
],
[
matchers
.
call
.
fn
(
apiRequest
),
[]],
])
.
dispatch
(
deepLinkingActions
.
deepLink
(
`
${
siteURL
}
/events/`
))
.
put
(
navigationActions
.
navigate
(
EVENT_LIST_SCENE
))
.
silentRun
());
it
(
'
shouldl load event on /events/{id} deeplink
'
,
()
=>
expectSaga
(
deepLinkingSaga
)
.
provide
([
[
select
(
loggedInSelector
),
true
],
[
matchers
.
call
.
fn
(
apiRequest
),
[]],
])
.
dispatch
(
deepLinkingActions
.
deepLink
(
`
${
siteURL
}
/events/1/`
))
.
put
(
eventActions
.
event
(
'
1
'
))
.
silentRun
());
it
(
'
should load pizzas on /pizzas/ deeplink
'
,
()
=>
expectSaga
(
deepLinkingSaga
)
.
provide
([
[
select
(
loggedInSelector
),
true
],
[
matchers
.
call
.
fn
(
apiRequest
),
[]],
])
.
dispatch
(
deepLinkingActions
.
deepLink
(
`
${
siteURL
}
/pizzas/`
))
.
put
(
pizzaActions
.
retrievePizzaInfo
())
.
silentRun
());
});
__tests__/sagas/event.spec.js
View file @
c70bf244
...
...
@@ -7,14 +7,16 @@ import { apiRequest, tokenSelector } from '../../app/utils/url';
import
eventSaga
from
'
../../app/sagas/event
'
;
import
*
as
eventActions
from
'
../../app/actions/event
'
;
import
*
as
navActions
from
'
../../app/actions/navigation
'
;
import
{
EVENT_SCENE
}
from
'
../../app/ui/components/navigator/scenes
'
;
jest
.
mock
(
'
../../app/utils/url
'
,
()
=>
({
apiRequest
:
jest
.
fn
(()
=>
{}),
tokenSelector
:
()
=>
'
token
'
,
}));
jest
.
mock
(
'
../../app/navigation
'
,
()
=>
({
navigate
:
jest
.
fn
(),
}));
describe
(
'
event saga
'
,
()
=>
{
const
error
=
new
Error
(
'
error
'
);
...
...
@@ -27,15 +29,6 @@ describe('event saga', () => {
.
put
(
eventActions
.
fetching
())
.
silentRun
());
it
(
'
should navigate to the event scene
'
,
()
=>
expectSaga
(
eventSaga
)
.
provide
([
[
select
(
tokenSelector
),
'
token
'
],
[
matchers
.
call
.
fn
(
apiRequest
),
[]],
])
.
dispatch
(
eventActions
.
event
(
1
))
.
put
(
navActions
.
navigate
(
EVENT_SCENE
))
.
silentRun
());
it
(
'
should put an error when the api request fails
'
,
()
=>
expectSaga
(
eventSaga
)
.
provide
([
[
select
(
tokenSelector
),
'
token
'
],
...
...
__tests__/sagas/pizza.spec.js
View file @
c70bf244
...
...
@@ -5,14 +5,16 @@ import { throwError } from 'redux-saga-test-plan/providers';
import
{
apiRequest
,
tokenSelector
}
from
'
../../app/utils/url
'
;
import
pizzaSaga
from
'
../../app/sagas/pizza
'
;
import
*
as
pizzaActions
from
'
../../app/actions/pizza
'
;
import
*
as
navigationActions
from
'
../../app/actions/navigation
'
;
import
{
PIZZA_SCENE
}
from
'
../../app/ui/components/navigator/scenes
'
;
jest
.
mock
(
'
../../app/utils/url
'
,
()
=>
({
apiRequest
:
jest
.
fn
(()
=>
{}),
tokenSelector
:
()
=>
'
token
'
,
}));
jest
.
mock
(
'
../../app/navigation
'
,
()
=>
({
navigate
:
jest
.
fn
(),
}));
describe
(
'
pizza saga
'
,
()
=>
{
const
error
=
new
Error
(
'
error
'
);
error
.
response
=
null
;
...
...
@@ -22,16 +24,6 @@ describe('pizza saga', () => {
});
describe
(
'
retrieve pizza info
'
,
()
=>
{
it
(
'
should start fetching and navigate on retrieve action
'
,
()
=>
expectSaga
(
pizzaSaga
)
.
provide
([
[
select
(
tokenSelector
),
'
token
'
],
[
matchers
.
call
.
fn
(
apiRequest
),
[]],
])
.
dispatch
(
pizzaActions
.
retrievePizzaInfo
())
.
put
(
pizzaActions
.
fetching
())
.
put
(
navigationActions
.
navigate
(
PIZZA_SCENE
))
.
silentRun
());
describe
(
'
failures
'
,
()
=>
{
beforeAll
(()
=>
{
error
.
response
=
null
;
...
...
@@ -254,4 +246,4 @@ describe('pizza saga', () => {
}));
});
});
});
\ No newline at end of file
});
__tests__/sagas/profile.spec.js
View file @
c70bf244
...
...
@@ -5,14 +5,16 @@ import { throwError } from 'redux-saga-test-plan/providers';
import
profileSaga
from
'
../../app/sagas/profile
'
;
import
{
apiRequest
,
tokenSelector
}
from
'
../../app/utils/url
'
;
import
*
as
profileActions
from
'
../../app/actions/profile
'
;
import
*
as
navActions
from
'
../../app/actions/navigation
'
;
import
{
PROFILE_SCENE
}
from
'
../../app/ui/components/navigator/scenes
'
;
jest
.
mock
(
'
../../app/utils/url
'
,
()
=>
({
apiRequest
:
jest
.
fn
(()
=>
{}),
tokenSelector
:
()
=>
'
token
'
,
}));
jest
.
mock
(
'
../../app/navigation
'
,
()
=>
({
navigate
:
jest
.
fn
(),
}));
describe
(
'
profile saga
'
,
()
=>
{
const
error
=
new
Error
(
'
error
'
);
...
...
@@ -21,9 +23,8 @@ describe('profile saga', () => {
[
select
(
tokenSelector
),
'
token
'
],
[
matchers
.
call
.
fn
(
apiRequest
),
[]],
])
.
dispatch
(
profileActions
.
profile
(
'
token
'
,
1
))
.
dispatch
(
profileActions
.
profile
(
1
))
.
put
(
profileActions
.
fetching
())
.
put
(
navActions
.
navigate
(
PROFILE_SCENE
))
.
silentRun
());
it
(
'
should put success when the request succeeds
'
,
()
=>
expectSaga
(
profileSaga
)
...
...
@@ -31,7 +32,7 @@ describe('profile saga', () => {
[
select
(
tokenSelector
),
'
token
'
],
[
matchers
.
call
.
like
({
fn
:
apiRequest
,
args
:
[
'
members/1
'
]
}),
'
data
'
],
])
.
dispatch
(
profileActions
.
profile
(
'
token
'
,
1
))
.
dispatch
(
profileActions
.
profile
(
1
))
.
put
(
profileActions
.
success
(
'
data
'
))
.
silentRun
());
...
...
@@ -40,7 +41,7 @@ describe('profile saga', () => {
[
select
(
tokenSelector
),
'
token
'
],
[
matchers
.
call
.
like
({
fn
:
apiRequest
,
args
:
[
'
members/1
'
]
}),
throwError
(
error
)],
])
.
dispatch
(
profileActions
.
profile
(
'
token
'
,
1
))
.
dispatch
(
profileActions
.
profile
(
1
))
.
put
(
profileActions
.
failure
())
.
silentRun
());
...
...
@@ -48,7 +49,7 @@ describe('profile saga', () => {
.
provide
([
[
select
(
tokenSelector
),
'
token
'
],
])
.
dispatch
(
profileActions
.
profile
(
'
token
'
,
1
))
.
dispatch
(
profileActions
.
profile
(
1
))
.
silentRun
()
.
then
(()
=>
{
expect
(
apiRequest
).
toBeCalledWith
(
'
members/1
'
,
{
...
...
__tests__/sagas/registration.spec.js
View file @
c70bf244
...
...
@@ -7,8 +7,6 @@ import * as registrationActions from '../../app/actions/registration';
import
registrationSaga
,
{
eventSelector
}
from
'
../../app/sagas/registration
'
;
import
{
apiRequest
,
tokenSelector
}
from
'
../../app/utils/url
'
;
import
*
as
eventActions
from
'
../../app/actions/event
'
;
import
*
as
navigationActions
from
'
../../app/actions/navigation
'
;
import
{
REGISTRATION_SCENE
}
from
'
../../app/ui/components/navigator/scenes
'
;
jest
.
mock
(
'
react-native-snackbar
'
,
()
=>
({
LENGTH_LONG
:
100
,
...
...
@@ -16,6 +14,11 @@ jest.mock('react-native-snackbar', () => ({
dismiss
:
jest
.
fn
(),
}));
jest
.
mock
(
'
../../app/navigation
'
,
()
=>
({
navigate
:
jest
.
fn
(),
goBack
:
jest
.
fn
(),
}));
jest
.
mock
(
'
../../app/utils/url
'
,
()
=>
({
apiRequest
:
jest
.
fn
(()
=>
{}),
tokenSelector
:
()
=>
'
token
'
,
...
...
@@ -66,16 +69,6 @@ describe('registration saga', () => {
);
}));
it
(
'
should put a retrieve fields action when they are available
'
,
()
=>
expectSaga
(
registrationSaga
)
.
provide
([
[
select
(
tokenSelector
),
'
token
'
],
[
matchers
.
call
.
like
({
fn
:
apiRequest
,
args
:
[
'
events/1/registrations
'
]
}),
{
fields
:
{},
pk
:
2
}],
])
.
dispatch
(
registrationActions
.
register
(
1
))
.
put
(
registrationActions
.
retrieveFields
(
2
))
.
silentRun
());
it
(
'
should show a failure action when the request fails
'
,
()
=>
expectSaga
(
registrationSaga
)
.
provide
([
[
select
(
tokenSelector
),
'
token
'
],
...
...
@@ -122,15 +115,6 @@ describe('registration saga', () => {
.
put
(
registrationActions
.
success
())
.
silentRun
());
it
(
'
should navigate back on success
'
,
()
=>
expectSaga
(
registrationSaga
)
.
provide
([
[
select
(
tokenSelector
),
'
token
'
],
[
matchers
.
call
.
like
({
fn
:
apiRequest
,
args
:
[
'
registrations/1
'
]
})],
])
.
dispatch
(
registrationActions
.
update
(
1
,
{}))
.
put
(
navigationActions
.
back
())
.
silentRun
());
it
(
'
should show a snackbar on success
'
,
()
=>
expectSaga
(
registrationSaga
)
.
provide
([
[
select
(
tokenSelector
),
'
token
'
],
...
...
@@ -253,11 +237,6 @@ describe('registration saga', () => {
.
put
(
registrationActions
.
loading
())
.
silentRun
());
it
(
'
should navigate to the registration screen
'
,
()
=>
expectSaga
(
registrationSaga
)
.
dispatch
(
registrationActions
.
retrieveFields
(
1
))
.
put
(
navigationActions
.
navigate
(
REGISTRATION_SCENE
))
.
silentRun
());
it
(
'
should put showFields action when the request succeeds
'
,
()
=>
expectSaga
(
registrationSaga
)
.
provide
([
[
select
(
tokenSelector
),
'
token
'
],
...
...
__tests__/sagas/session.spec.js
View file @
c70bf244
...
...
@@ -6,12 +6,13 @@ import { AsyncStorage } from 'react-native';
import
{
Sentry
}
from
'
react-native-sentry
'
;
import
sessionSaga
,
{
DISPLAYNAMEKEY
,
PHOTOKEY
,
TOKENKEY
,
USERNAMEKEY
DISPLAYNAMEKEY
,
PHOTOKEY
,
TOKENKEY
,
USERNAMEKEY
,
}
from
'
../../app/sagas/session
'
;
import
{
apiRequest
}
from
'
../../app/utils/url
'
;
import
*
as
sessionActions
from
'
../../app/actions/session
'
;
import
*
as
pushNotificationsActions
from
'
../../app/actions/pushNotifications
'
;
jest
.
mock
(
'
react-native-snackbar
'
,
()
=>
({
LENGTH_LONG
:
100
,
show
:
jest
.
fn
(),
...
...
@@ -22,12 +23,17 @@ jest.mock('react-native', () => ({
AsyncStorage
:
{
multiSet
:
jest
.
fn
(),
multiRemove
:
jest
.
fn
(),
clear
:
jest
.
fn
(),
},
}));
jest
.
mock
(
'
../../app/utils/url
'
,
()
=>
({
apiRequest
:
jest
.
fn
(()
=>
{}),
tokenSelector
:
()
=>
'
token
'
,
tokenSelector
:
()
=>
'
abc123
'
,
}));
jest
.
mock
(
'
../../app/navigation
'
,
()
=>
({
navigate
:
jest
.
fn
(),
}));
jest
.
mock
(
'
react-native-sentry
'
,
()
=>
({
...
...
@@ -41,23 +47,14 @@ describe('session saga', () => {
const
error
=
new
Error
(
'
error
'
);
describe
(
'
logging in
'
,
()
=>
{
it
(
'
should show a snackbar on start
'
,
()
=>
expectSaga
(
sessionSaga
)
.
dispatch
(
sessionActions
.
login
(
'
username
'
,
'
password
'
))
.
silentRun
()
.
then
(()
=>
{
expect
(
Snackbar
.
show
).
toBeCalledWith
(
{
title
:
'
Logging in
'
,
duration
:
Snackbar
.
LENGTH_INDEFINITE
},
);
}));
it
(
'
should put the result data when the request succeeds
'
,
()
=>
expectSaga
(
sessionSaga
)
.
provide
([
[
matchers
.
call
.
like
({
fn
:
apiRequest
,
args
:
[
'
token-auth
'
]
}),
{
token
:
'
abc123
'
}],
[
matchers
.
call
.
like
({
fn
:
Sentry
.
setUserContext
}),
{}],
])
.
put
(
sessionActions
.
s
uccess
(
'
username
'
,
'
abc123
'
))
.
put
(
sessionActions
.
profile
(
'
abc123
'
))
.
dispatch
(
sessionActions
.
logi
n
(
'
username
'
,
'
password
'
))
.
put
(
sessionActions
.
s
ignedIn
(
'
username
'
,
'
abc123
'
))
.
put
(
sessionActions
.
fetchUserInfo
(
))
.
dispatch
(
sessionActions
.
signI
n
(
'
username
'
,
'
password
'
))
.
silentRun
());
it
(
'
should show a snackbar when the request succeeds
'
,
()
=>
expectSaga
(
sessionSaga
)
...
...
@@ -65,10 +62,9 @@ describe('session saga', () => {
[
matchers
.
call
.
like
({
fn
:
apiRequest
,
args
:
[
'
token-auth
'
]
}),
{
token
:
'
abc123
'
}],
[
matchers
.
call
.
like
({
fn
:
Sentry
.
setUserContext
}),
{}],
])
.
dispatch
(
sessionActions
.
logi
n
(
'
username
'
,
'
password
'
))
.
dispatch
(
sessionActions
.
signI
n
(
'
username
'
,
'
password
'
))
.
silentRun
()
.
then
(()
=>
{
expect
(
Snackbar
.
dismiss
).
toBeCalled
();
expect
(
Snackbar
.
show
).
toBeCalledWith
(
{
title
:
'
Login successful
'
},
);
...
...
@@ -79,7 +75,7 @@ describe('session saga', () => {
[
matchers
.
call
.
like
({
fn
:
apiRequest
,
args
:
[
'
token-auth
'
]
}),
{
token
:
'
abc123
'
}],
[
matchers
.
call
.
like
({
fn
:
Sentry
.
setUserContext
}),
{}],
])
.
dispatch
(
sessionActions
.
logi
n
(
'
username
'
,
'
password
'
))
.
dispatch
(
sessionActions
.
signI
n
(
'
username
'
,
'
password
'
))
.
silentRun
()
.
then
(()
=>
{
expect
(
AsyncStorage
.
multiSet
).
toBeCalledWith
([
...
...
@@ -88,21 +84,28 @@ describe('session saga', () => {
]);
}));
it
(
'
should put token invalid when the request fails
'
,
()
=>
expectSaga
(
sessionSaga
)
.
provide
([
[
matchers
.
call
.
fn
(
apiRequest
),
throwError
(
error
)],
])
.
put
(
sessionActions
.
tokenInvalid
())
.
dispatch
(
sessionActions
.
signIn
(
'
username
'
,
'
password
'
))
.
silentRun
());
it
(
'
should show a snackbar when the request fails
'
,
()
=>
expectSaga
(
sessionSaga
)
.
provide
([
[
matchers
.
call
.
fn
(
apiRequest
),
throwError
(
error
)],
])
.
dispatch
(
sessionActions
.
logi
n
(
'
username
'
,
'
password
'
))
.
dispatch
(
sessionActions
.
signI
n
(
'
username
'
,
'
password
'
))
.
silentRun
()
.
then
(()
=>
{
expect
(
Snackbar
.
dismiss
).
toBeCalled
();
expect
(
Snackbar
.
show
).
toBeCalledWith
(
{
title
:
'
Login failed