@passlock/client 0.9.19 → 0.9.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -21
- package/dist/authentication/authenticate.d.ts +5 -4
- package/dist/authentication/authenticate.d.ts.map +1 -1
- package/dist/authentication/authenticate.fixture.d.ts +3 -4
- package/dist/authentication/authenticate.fixture.d.ts.map +1 -1
- package/dist/authentication/authenticate.fixture.js +2 -11
- package/dist/authentication/authenticate.fixture.js.map +1 -1
- package/dist/authentication/authenticate.js +4 -4
- package/dist/authentication/authenticate.js.map +1 -1
- package/dist/connection/connection.d.ts +4 -3
- package/dist/connection/connection.d.ts.map +1 -1
- package/dist/connection/connection.fixture.d.ts +3 -5
- package/dist/connection/connection.fixture.d.ts.map +1 -1
- package/dist/connection/connection.fixture.js +3 -15
- package/dist/connection/connection.fixture.js.map +1 -1
- package/dist/connection/connection.js +3 -3
- package/dist/connection/connection.js.map +1 -1
- package/dist/effect.d.ts +1 -1
- package/dist/effect.d.ts.map +1 -1
- package/dist/effect.js +17 -8
- package/dist/effect.js.map +1 -1
- package/dist/email/email.d.ts +4 -4
- package/dist/email/email.d.ts.map +1 -1
- package/dist/email/email.fixture.d.ts +2 -3
- package/dist/email/email.fixture.d.ts.map +1 -1
- package/dist/email/email.fixture.js +2 -10
- package/dist/email/email.fixture.js.map +1 -1
- package/dist/email/email.js +2 -3
- package/dist/email/email.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/logging/eventLogger.d.ts.map +1 -1
- package/dist/logging/eventLogger.js +15 -9
- package/dist/logging/eventLogger.js.map +1 -1
- package/dist/registration/register.d.ts +6 -4
- package/dist/registration/register.d.ts.map +1 -1
- package/dist/registration/register.fixture.d.ts +3 -4
- package/dist/registration/register.fixture.d.ts.map +1 -1
- package/dist/registration/register.fixture.js +2 -12
- package/dist/registration/register.fixture.js.map +1 -1
- package/dist/registration/register.js +5 -4
- package/dist/registration/register.js.map +1 -1
- package/dist/rpc/authentication.d.ts +9 -0
- package/dist/rpc/authentication.d.ts.map +1 -0
- package/dist/rpc/authentication.js +15 -0
- package/dist/rpc/authentication.js.map +1 -0
- package/dist/rpc/client.d.ts +27 -0
- package/dist/rpc/client.d.ts.map +1 -0
- package/dist/rpc/client.js +92 -0
- package/dist/rpc/client.js.map +1 -0
- package/dist/rpc/config.d.ts +16 -0
- package/dist/rpc/config.d.ts.map +1 -0
- package/dist/rpc/config.js +6 -0
- package/dist/rpc/config.js.map +1 -0
- package/dist/rpc/connection.d.ts +9 -0
- package/dist/rpc/connection.d.ts.map +1 -0
- package/dist/rpc/connection.js +14 -0
- package/dist/rpc/connection.js.map +1 -0
- package/dist/rpc/registration.d.ts +9 -0
- package/dist/rpc/registration.d.ts.map +1 -0
- package/dist/rpc/registration.js +15 -0
- package/dist/rpc/registration.js.map +1 -0
- package/dist/rpc/social.d.ts +11 -0
- package/dist/rpc/social.d.ts.map +1 -0
- package/dist/rpc/social.js +17 -0
- package/dist/rpc/social.js.map +1 -0
- package/dist/rpc/user.d.ts +9 -0
- package/dist/rpc/user.d.ts.map +1 -0
- package/dist/rpc/user.js +18 -0
- package/dist/rpc/user.js.map +1 -0
- package/dist/social/social.d.ts +4 -4
- package/dist/social/social.d.ts.map +1 -1
- package/dist/social/social.fixture.d.ts +1 -2
- package/dist/social/social.fixture.d.ts.map +1 -1
- package/dist/social/social.fixture.js +5 -14
- package/dist/social/social.fixture.js.map +1 -1
- package/dist/social/social.js +6 -6
- package/dist/social/social.js.map +1 -1
- package/dist/storage/storage.d.ts +1 -1
- package/dist/storage/storage.d.ts.map +1 -1
- package/dist/test/fixtures.d.ts +1 -3
- package/dist/test/fixtures.d.ts.map +1 -1
- package/dist/test/fixtures.js +0 -2
- package/dist/test/fixtures.js.map +1 -1
- package/dist/user/user.d.ts +4 -4
- package/dist/user/user.d.ts.map +1 -1
- package/dist/user/user.fixture.d.ts +2 -3
- package/dist/user/user.fixture.d.ts.map +1 -1
- package/dist/user/user.fixture.js +2 -10
- package/dist/user/user.fixture.js.map +1 -1
- package/dist/user/user.js +3 -4
- package/dist/user/user.js.map +1 -1
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/package.json +24 -23
- package/src/authentication/authenticate.fixture.ts +8 -16
- package/src/authentication/authenticate.test.ts +7 -7
- package/src/authentication/authenticate.ts +13 -14
- package/src/connection/connection.fixture.ts +4 -16
- package/src/connection/connection.test.ts +7 -6
- package/src/connection/connection.ts +5 -5
- package/src/effect.ts +20 -14
- package/src/email/email.fixture.ts +3 -11
- package/src/email/email.test.ts +7 -7
- package/src/email/email.ts +5 -6
- package/src/index.ts +5 -2
- package/src/logging/eventLogger.test.ts +1 -0
- package/src/logging/eventLogger.ts +16 -10
- package/src/registration/register.fixture.ts +9 -18
- package/src/registration/register.test.ts +9 -9
- package/src/registration/register.ts +12 -13
- package/src/social/social.fixture.ts +7 -16
- package/src/social/social.test.ts +15 -15
- package/src/social/social.ts +9 -9
- package/src/storage/storage.ts +1 -1
- package/src/test/fixtures.ts +1 -3
- package/src/user/user.fixture.ts +3 -11
- package/src/user/user.test.ts +7 -7
- package/src/user/user.ts +6 -7
- package/dist/authentication/authenticate.test.d.ts +0 -2
- package/dist/authentication/authenticate.test.d.ts.map +0 -1
- package/dist/authentication/authenticate.test.js +0 -111
- package/dist/authentication/authenticate.test.js.map +0 -1
- package/dist/connection/connection.test.d.ts +0 -2
- package/dist/connection/connection.test.d.ts.map +0 -1
- package/dist/connection/connection.test.js +0 -35
- package/dist/connection/connection.test.js.map +0 -1
- package/dist/email/email.test.d.ts +0 -2
- package/dist/email/email.test.d.ts.map +0 -1
- package/dist/email/email.test.js +0 -99
- package/dist/email/email.test.js.map +0 -1
- package/dist/event/event.node.test.d.ts +0 -2
- package/dist/event/event.node.test.d.ts.map +0 -1
- package/dist/event/event.node.test.js +0 -13
- package/dist/event/event.node.test.js.map +0 -1
- package/dist/event/event.test.d.ts +0 -2
- package/dist/event/event.test.d.ts.map +0 -1
- package/dist/event/event.test.js +0 -30
- package/dist/event/event.test.js.map +0 -1
- package/dist/logging/eventLogger.test.d.ts +0 -2
- package/dist/logging/eventLogger.test.d.ts.map +0 -1
- package/dist/logging/eventLogger.test.js +0 -67
- package/dist/logging/eventLogger.test.js.map +0 -1
- package/dist/registration/register.test.d.ts +0 -2
- package/dist/registration/register.test.d.ts.map +0 -1
- package/dist/registration/register.test.js +0 -104
- package/dist/registration/register.test.js.map +0 -1
- package/dist/social/social.test.d.ts +0 -2
- package/dist/social/social.test.d.ts.map +0 -1
- package/dist/social/social.test.js +0 -110
- package/dist/social/social.test.js.map +0 -1
- package/dist/storage/storage.test.d.ts +0 -2
- package/dist/storage/storage.test.d.ts.map +0 -1
- package/dist/storage/storage.test.js +0 -120
- package/dist/storage/storage.test.js.map +0 -1
- package/dist/user/user.test.d.ts +0 -2
- package/dist/user/user.test.d.ts.map +0 -1
- package/dist/user/user.test.js +0 -56
- package/dist/user/user.test.js.map +0 -1
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { PreConnectRes } from '@passlock/shared/dist/rpc/connection.js'
|
|
2
|
-
import { RpcClient } from '@passlock/shared/dist/rpc/rpc.js'
|
|
3
1
|
import * as Shared from '@passlock/shared/dist/rpc/social.js'
|
|
4
|
-
import {
|
|
2
|
+
import { SocialClient } from '@passlock/shared/dist/rpc/social.js'
|
|
3
|
+
import { Effect as E, Layer as L } from 'effect'
|
|
5
4
|
import * as Fixtures from '../test/fixtures.js'
|
|
6
5
|
import type { AuthenticateOidcReq, RegisterOidcReq } from './social.js'
|
|
7
6
|
|
|
@@ -27,8 +26,8 @@ export const authOidcReq: AuthenticateOidcReq = {
|
|
|
27
26
|
|
|
28
27
|
export const rpcRegisterReq = new Shared.RegisterOidcReq({
|
|
29
28
|
...registerOidcReq,
|
|
30
|
-
givenName:
|
|
31
|
-
familyName:
|
|
29
|
+
...(registerOidcReq.givenName ? { givenName: registerOidcReq.givenName } : {}),
|
|
30
|
+
...(registerOidcReq.familyName ? { familyName: registerOidcReq.familyName } : {})
|
|
32
31
|
})
|
|
33
32
|
|
|
34
33
|
export const rpcRegisterRes = new Shared.PrincipalRes({ principal: Fixtures.principal })
|
|
@@ -38,19 +37,11 @@ export const rpcAuthenticateReq = new Shared.AuthOidcReq({ ...authOidcReq })
|
|
|
38
37
|
export const rpcAuthenticateRes = new Shared.PrincipalRes({ principal: Fixtures.principal })
|
|
39
38
|
|
|
40
39
|
export const rpcClientTest = L.succeed(
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
preConnect: () => E.succeed(new PreConnectRes({ warmed: true })),
|
|
44
|
-
isExistingUser: () => E.fail(Fixtures.notImplemented),
|
|
45
|
-
verifyEmail: () => E.fail(Fixtures.notImplemented),
|
|
46
|
-
getRegistrationOptions: () => E.fail(Fixtures.notImplemented),
|
|
47
|
-
verifyRegistrationCredential: () => E.fail(Fixtures.notImplemented),
|
|
48
|
-
getAuthenticationOptions: () => E.fail(Fixtures.notImplemented),
|
|
49
|
-
verifyAuthenticationCredential: () => E.fail(Fixtures.notImplemented),
|
|
40
|
+
SocialClient,
|
|
41
|
+
SocialClient.of({
|
|
50
42
|
registerOidc: () => E.fail(Fixtures.notImplemented),
|
|
51
43
|
authenticateOidc: () => E.fail(Fixtures.notImplemented),
|
|
52
|
-
|
|
53
|
-
}),
|
|
44
|
+
})
|
|
54
45
|
)
|
|
55
46
|
|
|
56
47
|
export const principal = Fixtures.principal
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Duplicate, NotFound } from '@passlock/shared/dist/error/error.js'
|
|
2
|
-
import {
|
|
2
|
+
import { SocialClient } from '@passlock/shared/dist/rpc/social.js'
|
|
3
3
|
import { Effect as E, Layer as L, Layer, LogLevel, Logger, pipe } from 'effect'
|
|
4
4
|
import { describe, expect, test } from 'vitest'
|
|
5
5
|
import { mock } from 'vitest-mock-extended'
|
|
@@ -15,9 +15,9 @@ describe('registerOidc should', () => {
|
|
|
15
15
|
})
|
|
16
16
|
|
|
17
17
|
const rpcClientTest = L.effect(
|
|
18
|
-
|
|
18
|
+
SocialClient,
|
|
19
19
|
E.sync(() => {
|
|
20
|
-
const rpcMock = mock<
|
|
20
|
+
const rpcMock = mock<SocialClient['Type']>()
|
|
21
21
|
|
|
22
22
|
rpcMock.registerOidc.mockReturnValue(E.succeed(Fixture.rpcRegisterRes))
|
|
23
23
|
|
|
@@ -41,14 +41,14 @@ describe('registerOidc should', () => {
|
|
|
41
41
|
const service = yield* _(SocialService)
|
|
42
42
|
yield* _(service.registerOidc(Fixture.registerOidcReq))
|
|
43
43
|
|
|
44
|
-
const rpcClient = yield* _(
|
|
44
|
+
const rpcClient = yield* _(SocialClient)
|
|
45
45
|
expect(rpcClient.registerOidc).toHaveBeenCalledWith(Fixture.rpcRegisterReq)
|
|
46
46
|
})
|
|
47
47
|
|
|
48
48
|
const rpcClientTest = L.effect(
|
|
49
|
-
|
|
49
|
+
SocialClient,
|
|
50
50
|
E.sync(() => {
|
|
51
|
-
const rpcMock = mock<
|
|
51
|
+
const rpcMock = mock<SocialClient['Type']>()
|
|
52
52
|
|
|
53
53
|
rpcMock.registerOidc.mockReturnValue(E.succeed(Fixture.rpcRegisterRes))
|
|
54
54
|
|
|
@@ -77,9 +77,9 @@ describe('registerOidc should', () => {
|
|
|
77
77
|
})
|
|
78
78
|
|
|
79
79
|
const rpcClientTest = L.effect(
|
|
80
|
-
|
|
80
|
+
SocialClient,
|
|
81
81
|
E.sync(() => {
|
|
82
|
-
const rpcMock = mock<
|
|
82
|
+
const rpcMock = mock<SocialClient['Type']>()
|
|
83
83
|
|
|
84
84
|
rpcMock.registerOidc.mockReturnValue(E.fail(new Duplicate({ message: "Duplicate user" })))
|
|
85
85
|
|
|
@@ -108,9 +108,9 @@ describe('authenticateIodc should', () => {
|
|
|
108
108
|
})
|
|
109
109
|
|
|
110
110
|
const rpcClientTest = L.effect(
|
|
111
|
-
|
|
111
|
+
SocialClient,
|
|
112
112
|
E.sync(() => {
|
|
113
|
-
const rpcMock = mock<
|
|
113
|
+
const rpcMock = mock<SocialClient['Type']>()
|
|
114
114
|
|
|
115
115
|
rpcMock.authenticateOidc.mockReturnValue(E.succeed(Fixture.rpcRegisterRes))
|
|
116
116
|
|
|
@@ -134,14 +134,14 @@ describe('authenticateIodc should', () => {
|
|
|
134
134
|
const service = yield* _(SocialService)
|
|
135
135
|
yield* _(service.authenticateOidc(Fixture.authOidcReq))
|
|
136
136
|
|
|
137
|
-
const rpcClient = yield* _(
|
|
137
|
+
const rpcClient = yield* _(SocialClient)
|
|
138
138
|
expect(rpcClient.authenticateOidc).toHaveBeenCalledWith(Fixture.rpcAuthenticateReq)
|
|
139
139
|
})
|
|
140
140
|
|
|
141
141
|
const rpcClientTest = L.effect(
|
|
142
|
-
|
|
142
|
+
SocialClient,
|
|
143
143
|
E.sync(() => {
|
|
144
|
-
const rpcMock = mock<
|
|
144
|
+
const rpcMock = mock<SocialClient['Type']>()
|
|
145
145
|
|
|
146
146
|
rpcMock.authenticateOidc.mockReturnValue(E.succeed(Fixture.rpcAuthenticateRes))
|
|
147
147
|
|
|
@@ -170,9 +170,9 @@ describe('authenticateIodc should', () => {
|
|
|
170
170
|
})
|
|
171
171
|
|
|
172
172
|
const rpcClientTest = L.effect(
|
|
173
|
-
|
|
173
|
+
SocialClient,
|
|
174
174
|
E.sync(() => {
|
|
175
|
-
const rpcMock = mock<
|
|
175
|
+
const rpcMock = mock<SocialClient['Type']>()
|
|
176
176
|
|
|
177
177
|
rpcMock.authenticateOidc.mockReturnValue(E.fail(new NotFound({ message: "User not found" })))
|
|
178
178
|
|
package/src/social/social.ts
CHANGED
|
@@ -5,12 +5,12 @@ import {
|
|
|
5
5
|
type BadRequest,
|
|
6
6
|
type NotSupported
|
|
7
7
|
} from '@passlock/shared/dist/error/error.js'
|
|
8
|
-
import { RpcClient } from '@passlock/shared/dist/rpc/rpc.js'
|
|
9
8
|
import * as Shared from '@passlock/shared/dist/rpc/social.js'
|
|
9
|
+
import { SocialClient } from '@passlock/shared/dist/rpc/social.js'
|
|
10
10
|
import type {
|
|
11
11
|
Principal
|
|
12
|
-
} from '@passlock/shared/dist/schema/
|
|
13
|
-
import { Context, Effect as E, Layer,
|
|
12
|
+
} from '@passlock/shared/dist/schema/principal.js'
|
|
13
|
+
import { Context, Effect as E, Layer, flow } from 'effect'
|
|
14
14
|
|
|
15
15
|
/* Requests */
|
|
16
16
|
|
|
@@ -49,7 +49,7 @@ export const SocialService = Context.GenericTag<SocialService>(
|
|
|
49
49
|
|
|
50
50
|
/* Effects */
|
|
51
51
|
|
|
52
|
-
type Dependencies =
|
|
52
|
+
type Dependencies = SocialClient
|
|
53
53
|
|
|
54
54
|
export const registerOidc = (
|
|
55
55
|
request: RegisterOidcReq,
|
|
@@ -57,12 +57,12 @@ export const registerOidc = (
|
|
|
57
57
|
return E.gen(function* (_) {
|
|
58
58
|
yield* _(E.logInfo('Registering social account'))
|
|
59
59
|
|
|
60
|
-
const rpcClient = yield* _(
|
|
60
|
+
const rpcClient = yield* _(SocialClient)
|
|
61
61
|
|
|
62
62
|
const rpcRequest = new Shared.RegisterOidcReq({
|
|
63
63
|
...request,
|
|
64
|
-
givenName:
|
|
65
|
-
familyName:
|
|
64
|
+
...(request.givenName ? { givenName: request.givenName } : {}),
|
|
65
|
+
...(request.familyName ? { familyName: request.familyName } : {})
|
|
66
66
|
})
|
|
67
67
|
|
|
68
68
|
const { principal } = yield* _(
|
|
@@ -79,7 +79,7 @@ export const authenticateOidc = (
|
|
|
79
79
|
return E.gen(function* (_) {
|
|
80
80
|
yield* _(E.logInfo('Authenticating with social account'))
|
|
81
81
|
|
|
82
|
-
const rpcClient = yield* _(
|
|
82
|
+
const rpcClient = yield* _(SocialClient)
|
|
83
83
|
const rpcRequest = new Shared.AuthOidcReq(request)
|
|
84
84
|
|
|
85
85
|
const { principal } = yield* _(
|
|
@@ -96,7 +96,7 @@ export const authenticateOidc = (
|
|
|
96
96
|
export const SocialServiceLive = Layer.effect(
|
|
97
97
|
SocialService,
|
|
98
98
|
E.gen(function* (_) {
|
|
99
|
-
const context = yield* _(E.context<
|
|
99
|
+
const context = yield* _(E.context<SocialClient>())
|
|
100
100
|
|
|
101
101
|
return SocialService.of({
|
|
102
102
|
registerOidc: flow(registerOidc, E.provide(context)),
|
package/src/storage/storage.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Wrapper around local storage that allows us to store
|
|
3
3
|
* authentication tokens in local storage for a short period.
|
|
4
4
|
*/
|
|
5
|
-
import type { Principal } from '@passlock/shared/dist/schema/
|
|
5
|
+
import type { Principal } from '@passlock/shared/dist/schema/principal.js'
|
|
6
6
|
import { Context, Effect as E, Layer, Option as O, flow, pipe } from 'effect'
|
|
7
7
|
import type { NoSuchElementException } from 'effect/Cause'
|
|
8
8
|
|
package/src/test/fixtures.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { BadRequest } from '@passlock/shared/dist/error/error.js'
|
|
2
|
-
import {
|
|
3
|
-
import type { Principal } from '@passlock/shared/dist/schema/schema.js'
|
|
2
|
+
import type { Principal } from '@passlock/shared/dist/schema/principal.js'
|
|
4
3
|
import { Effect as E, Layer as L } from 'effect'
|
|
5
4
|
import { Capabilities } from '../capabilities/capabilities.js'
|
|
6
5
|
import { StorageService, type StoredToken } from '../storage/storage.js'
|
|
@@ -51,5 +50,4 @@ export const storageServiceTest = L.succeed(
|
|
|
51
50
|
}),
|
|
52
51
|
)
|
|
53
52
|
|
|
54
|
-
export const preConnectRes = new PreConnectRes({ warmed: true })
|
|
55
53
|
export const notImplemented = new BadRequest({ message: 'Not implemented' })
|
package/src/user/user.fixture.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { IsExistingUserReq, IsExistingUserRes, ResendEmailReq, ResendEmailRes, VerifyEmailRes } from '@passlock/shared/dist/rpc/user.js'
|
|
1
|
+
import { IsExistingUserReq, IsExistingUserRes, ResendEmailReq, ResendEmailRes, UserClient, VerifyEmailRes } from '@passlock/shared/dist/rpc/user.js'
|
|
3
2
|
import { Effect as E, Layer as L } from 'effect'
|
|
4
3
|
import * as Fixtures from '../test/fixtures.js'
|
|
5
4
|
import type { ResendEmail } from './user.js'
|
|
@@ -13,17 +12,10 @@ export const rpcResendEmailReq = new ResendEmailReq({ userId: '123', verifyEmail
|
|
|
13
12
|
export const rpcResendEmailRes = new ResendEmailRes({ })
|
|
14
13
|
|
|
15
14
|
export const rpcClientTest = L.succeed(
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
preConnect: () => E.succeed({ warmed: true }),
|
|
15
|
+
UserClient,
|
|
16
|
+
UserClient.of({
|
|
19
17
|
isExistingUser: () => E.succeed({ existingUser: true }),
|
|
20
18
|
verifyEmail: () => E.succeed(verifyEmailRes),
|
|
21
|
-
getRegistrationOptions: () => E.fail(Fixtures.notImplemented),
|
|
22
|
-
verifyRegistrationCredential: () => E.fail(Fixtures.notImplemented),
|
|
23
|
-
getAuthenticationOptions: () => E.fail(Fixtures.notImplemented),
|
|
24
|
-
verifyAuthenticationCredential: () => E.fail(Fixtures.notImplemented),
|
|
25
|
-
registerOidc: () => E.fail(Fixtures.notImplemented),
|
|
26
|
-
authenticateOidc: () => E.fail(Fixtures.notImplemented),
|
|
27
19
|
resendVerificationEmail: () => E.fail(Fixtures.notImplemented),
|
|
28
20
|
}),
|
|
29
21
|
)
|
package/src/user/user.test.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { UserClient } from '@passlock/shared/dist/rpc/user.js'
|
|
2
2
|
import { Effect as E, Layer as L, Layer, LogLevel, Logger, pipe } from 'effect'
|
|
3
3
|
import { describe, expect, test } from 'vitest'
|
|
4
4
|
import { mock } from 'vitest-mock-extended'
|
|
@@ -27,14 +27,14 @@ describe('isExistingUser should', () => {
|
|
|
27
27
|
const result = yield* _(service.isExistingUser({ email: Fixture.email }))
|
|
28
28
|
|
|
29
29
|
expect(result).toBe(false)
|
|
30
|
-
const rpcClient = yield* _(
|
|
30
|
+
const rpcClient = yield* _(UserClient)
|
|
31
31
|
expect(rpcClient.isExistingUser).toBeCalledWith(Fixture.isRegisteredReq)
|
|
32
32
|
})
|
|
33
33
|
|
|
34
34
|
const rpcClientTest = Layer.effect(
|
|
35
|
-
|
|
35
|
+
UserClient,
|
|
36
36
|
E.sync(() => {
|
|
37
|
-
const rpcMock = mock<
|
|
37
|
+
const rpcMock = mock<UserClient['Type']>()
|
|
38
38
|
|
|
39
39
|
rpcMock.isExistingUser.mockReturnValue(E.succeed(Fixture.isRegisteredRes))
|
|
40
40
|
|
|
@@ -57,14 +57,14 @@ describe('resendVerificationEmail should', () => {
|
|
|
57
57
|
const service = yield* _(UserService)
|
|
58
58
|
yield* _(service.resendVerificationEmail(Fixture.resendEmailReq))
|
|
59
59
|
|
|
60
|
-
const rpcClient = yield* _(
|
|
60
|
+
const rpcClient = yield* _(UserClient)
|
|
61
61
|
expect(rpcClient.resendVerificationEmail).toBeCalledWith(Fixture.rpcResendEmailReq)
|
|
62
62
|
})
|
|
63
63
|
|
|
64
64
|
const rpcClientTest = Layer.effect(
|
|
65
|
-
|
|
65
|
+
UserClient,
|
|
66
66
|
E.sync(() => {
|
|
67
|
-
const rpcMock = mock<
|
|
67
|
+
const rpcMock = mock<UserClient['Type']>()
|
|
68
68
|
|
|
69
69
|
rpcMock.resendVerificationEmail.mockReturnValue(E.succeed(Fixture.rpcResendEmailRes))
|
|
70
70
|
|
package/src/user/user.ts
CHANGED
|
@@ -2,9 +2,8 @@
|
|
|
2
2
|
* Check for an existing user
|
|
3
3
|
*/
|
|
4
4
|
import type { BadRequest, Disabled, NotFound } from '@passlock/shared/dist/error/error.js'
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import type { VerifyEmail } from '@passlock/shared/dist/schema/schema.js'
|
|
5
|
+
import { IsExistingUserReq, ResendEmailReq, UserClient } from '@passlock/shared/dist/rpc/user.js'
|
|
6
|
+
import type { VerifyEmail } from '@passlock/shared/dist/schema/email.js'
|
|
8
7
|
import { Context, Effect as E, Layer, flow } from 'effect'
|
|
9
8
|
|
|
10
9
|
/* Requests */
|
|
@@ -27,12 +26,12 @@ export const UserService = Context.GenericTag<UserService>('@services/UserServic
|
|
|
27
26
|
|
|
28
27
|
/* Effects */
|
|
29
28
|
|
|
30
|
-
type Dependencies =
|
|
29
|
+
type Dependencies = UserClient
|
|
31
30
|
|
|
32
31
|
export const isExistingUser = (request: Email): E.Effect<boolean, BadRequest, Dependencies> => {
|
|
33
32
|
return E.gen(function* (_) {
|
|
34
33
|
yield* _(E.logInfo('Checking registration status'))
|
|
35
|
-
const rpcClient = yield* _(
|
|
34
|
+
const rpcClient = yield* _(UserClient)
|
|
36
35
|
|
|
37
36
|
yield* _(E.logDebug('Making RPC request'))
|
|
38
37
|
const { existingUser } = yield* _(rpcClient.isExistingUser(new IsExistingUserReq(request)))
|
|
@@ -44,7 +43,7 @@ export const isExistingUser = (request: Email): E.Effect<boolean, BadRequest, De
|
|
|
44
43
|
export const resendVerificationEmail = (request: ResendEmail): E.Effect<void, ResendEmailErrors, Dependencies> => {
|
|
45
44
|
return E.gen(function* (_) {
|
|
46
45
|
yield* _(E.logInfo('Resending verification email'))
|
|
47
|
-
const rpcClient = yield* _(
|
|
46
|
+
const rpcClient = yield* _(UserClient)
|
|
48
47
|
|
|
49
48
|
yield* _(E.logDebug('Making RPC request'))
|
|
50
49
|
const { userId, ...verifyEmail } = request
|
|
@@ -58,7 +57,7 @@ export const resendVerificationEmail = (request: ResendEmail): E.Effect<void, Re
|
|
|
58
57
|
export const UserServiceLive = Layer.effect(
|
|
59
58
|
UserService,
|
|
60
59
|
E.gen(function* (_) {
|
|
61
|
-
const context = yield* _(E.context<
|
|
60
|
+
const context = yield* _(E.context<UserClient>())
|
|
62
61
|
return UserService.of({
|
|
63
62
|
isExistingUser: flow(isExistingUser, E.provide(context)),
|
|
64
63
|
resendVerificationEmail: flow(resendVerificationEmail, E.provide(context))
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"authenticate.test.d.ts","sourceRoot":"","sources":["../../src/authentication/authenticate.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
import { RpcClient } from '@passlock/shared/dist/rpc/rpc.js';
|
|
2
|
-
import { Effect as E, Layer as L, Layer, LogLevel, Logger, pipe } from 'effect';
|
|
3
|
-
import { describe, expect, test, vi } from 'vitest';
|
|
4
|
-
import { mock } from 'vitest-mock-extended';
|
|
5
|
-
import { StorageService } from '../storage/storage.js';
|
|
6
|
-
import * as Fixture from './authenticate.fixture.js';
|
|
7
|
-
import { AuthenticateServiceLive, AuthenticationService, GetCredential } from './authenticate.js';
|
|
8
|
-
describe('authenticate should', () => {
|
|
9
|
-
test('return a valid principal', async () => {
|
|
10
|
-
const assertions = E.gen(function* (_) {
|
|
11
|
-
const service = yield* _(AuthenticationService);
|
|
12
|
-
const result = yield* _(service.authenticatePasskey({ userVerification: 'preferred' }));
|
|
13
|
-
expect(result).toEqual(Fixture.principal);
|
|
14
|
-
});
|
|
15
|
-
const service = pipe(AuthenticateServiceLive, L.provide(Fixture.getCredentialTest), L.provide(Fixture.capabilitiesTest), L.provide(Fixture.storageServiceTest), L.provide(Fixture.rpcClientTest));
|
|
16
|
-
const effect = pipe(E.provide(assertions, service), Logger.withMinimumLogLevel(LogLevel.None));
|
|
17
|
-
return E.runPromise(effect);
|
|
18
|
-
});
|
|
19
|
-
test('pass the authentication request to the backend', async () => {
|
|
20
|
-
const assertions = E.gen(function* (_) {
|
|
21
|
-
const service = yield* _(AuthenticationService);
|
|
22
|
-
yield* _(service.authenticatePasskey({ userVerification: 'preferred' }));
|
|
23
|
-
const rpcClient = yield* _(RpcClient);
|
|
24
|
-
expect(rpcClient.getAuthenticationOptions).toHaveBeenCalledOnce();
|
|
25
|
-
expect(rpcClient.verifyAuthenticationCredential).toHaveBeenCalledOnce();
|
|
26
|
-
});
|
|
27
|
-
const rpcClientTest = L.effect(RpcClient, E.sync(() => {
|
|
28
|
-
const rpcMock = mock();
|
|
29
|
-
rpcMock.getAuthenticationOptions.mockReturnValue(E.succeed(Fixture.rpcOptionsRes));
|
|
30
|
-
rpcMock.verifyAuthenticationCredential.mockReturnValue(E.succeed(Fixture.rpcVerificationRes));
|
|
31
|
-
return rpcMock;
|
|
32
|
-
}));
|
|
33
|
-
const service = pipe(AuthenticateServiceLive, L.provide(Fixture.getCredentialTest), L.provide(Fixture.capabilitiesTest), L.provide(Fixture.storageServiceTest), L.provide(rpcClientTest));
|
|
34
|
-
const layers = Layer.merge(service, rpcClientTest);
|
|
35
|
-
const effect = pipe(E.provide(assertions, layers), Logger.withMinimumLogLevel(LogLevel.None));
|
|
36
|
-
return E.runPromise(effect);
|
|
37
|
-
});
|
|
38
|
-
test('send the credential to the backend', async () => {
|
|
39
|
-
const assertions = E.gen(function* (_) {
|
|
40
|
-
const service = yield* _(AuthenticationService);
|
|
41
|
-
yield* _(service.authenticatePasskey({ userVerification: 'preferred' }));
|
|
42
|
-
const rpcClient = yield* _(RpcClient);
|
|
43
|
-
expect(rpcClient.getAuthenticationOptions).toHaveBeenCalledOnce();
|
|
44
|
-
expect(rpcClient.verifyAuthenticationCredential).toHaveBeenCalledWith(Fixture.rpcVerificationReq);
|
|
45
|
-
});
|
|
46
|
-
const rpcClientTest = L.effect(RpcClient, E.sync(() => {
|
|
47
|
-
const rpcMock = mock();
|
|
48
|
-
rpcMock.getAuthenticationOptions.mockReturnValue(E.succeed(Fixture.rpcOptionsRes));
|
|
49
|
-
rpcMock.verifyAuthenticationCredential.mockReturnValue(E.succeed(Fixture.rpcVerificationRes));
|
|
50
|
-
return rpcMock;
|
|
51
|
-
}));
|
|
52
|
-
const service = pipe(AuthenticateServiceLive, L.provide(Fixture.getCredentialTest), L.provide(Fixture.capabilitiesTest), L.provide(Fixture.storageServiceTest), L.provide(rpcClientTest));
|
|
53
|
-
const layers = Layer.merge(service, rpcClientTest);
|
|
54
|
-
const effect = pipe(E.provide(assertions, layers), Logger.withMinimumLogLevel(LogLevel.None));
|
|
55
|
-
return E.runPromise(effect);
|
|
56
|
-
});
|
|
57
|
-
test('store the credential in local storage', async () => {
|
|
58
|
-
const assertions = E.gen(function* (_) {
|
|
59
|
-
const service = yield* _(AuthenticationService);
|
|
60
|
-
yield* _(service.authenticatePasskey({ userVerification: 'preferred' }));
|
|
61
|
-
const storageService = yield* _(StorageService);
|
|
62
|
-
expect(storageService.storeToken).toHaveBeenCalledWith(Fixture.principal);
|
|
63
|
-
});
|
|
64
|
-
const storageServiceTest = L.effect(StorageService, E.sync(() => {
|
|
65
|
-
const storageMock = mock();
|
|
66
|
-
storageMock.storeToken.mockReturnValue(E.void);
|
|
67
|
-
storageMock.clearExpiredToken.mockReturnValue(E.void);
|
|
68
|
-
return storageMock;
|
|
69
|
-
}));
|
|
70
|
-
const service = pipe(AuthenticateServiceLive, L.provide(Fixture.getCredentialTest), L.provide(Fixture.capabilitiesTest), L.provide(Fixture.rpcClientTest), L.provide(storageServiceTest));
|
|
71
|
-
const layers = Layer.merge(service, storageServiceTest);
|
|
72
|
-
const effect = pipe(E.provide(assertions, layers), Logger.withMinimumLogLevel(LogLevel.None));
|
|
73
|
-
return E.runPromise(effect);
|
|
74
|
-
});
|
|
75
|
-
test('schedule deletion of the local token', async () => {
|
|
76
|
-
const assertions = E.gen(function* (_) {
|
|
77
|
-
const service = yield* _(AuthenticationService);
|
|
78
|
-
yield* _(service.authenticatePasskey({ userVerification: 'preferred' }));
|
|
79
|
-
const storageService = yield* _(StorageService);
|
|
80
|
-
expect(storageService.clearExpiredToken).toHaveBeenCalledWith('passkey');
|
|
81
|
-
});
|
|
82
|
-
const storageServiceTest = L.effect(StorageService, E.sync(() => {
|
|
83
|
-
const storageMock = mock();
|
|
84
|
-
storageMock.storeToken.mockReturnValue(E.void);
|
|
85
|
-
storageMock.clearExpiredToken.mockReturnValue(E.void);
|
|
86
|
-
return storageMock;
|
|
87
|
-
}));
|
|
88
|
-
const service = pipe(AuthenticateServiceLive, L.provide(Fixture.getCredentialTest), L.provide(Fixture.capabilitiesTest), L.provide(Fixture.rpcClientTest), L.provide(storageServiceTest));
|
|
89
|
-
const layers = Layer.merge(service, storageServiceTest);
|
|
90
|
-
const effect = pipe(E.provide(assertions, layers), Logger.withMinimumLogLevel(LogLevel.None));
|
|
91
|
-
return E.runPromise(effect);
|
|
92
|
-
});
|
|
93
|
-
test("return an error if the browser can't create a credential", async () => {
|
|
94
|
-
const assertions = E.gen(function* (_) {
|
|
95
|
-
const service = yield* _(AuthenticationService);
|
|
96
|
-
yield* _(service.authenticatePasskey({ userVerification: 'preferred' }));
|
|
97
|
-
const getCredential = yield* _(GetCredential);
|
|
98
|
-
expect(getCredential).toHaveBeenCalledOnce();
|
|
99
|
-
});
|
|
100
|
-
const getCredentialTest = L.effect(GetCredential, E.sync(() => {
|
|
101
|
-
const getCredentialMock = vi.fn();
|
|
102
|
-
getCredentialMock.mockReturnValue(E.succeed(Fixture.credential));
|
|
103
|
-
return getCredentialMock;
|
|
104
|
-
}));
|
|
105
|
-
const service = pipe(AuthenticateServiceLive, L.provide(Fixture.storageServiceTest), L.provide(Fixture.capabilitiesTest), L.provide(Fixture.rpcClientTest), L.provide(getCredentialTest));
|
|
106
|
-
const layers = Layer.merge(service, getCredentialTest);
|
|
107
|
-
const effect = pipe(E.provide(assertions, layers), Logger.withMinimumLogLevel(LogLevel.None));
|
|
108
|
-
return E.runPromise(effect);
|
|
109
|
-
});
|
|
110
|
-
});
|
|
111
|
-
//# sourceMappingURL=authenticate.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"authenticate.test.js","sourceRoot":"","sources":["../../src/authentication/authenticate.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"connection.test.d.ts","sourceRoot":"","sources":["../../src/connection/connection.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { RpcConfig } from '@passlock/shared/dist/rpc/config.js';
|
|
2
|
-
import { Dispatcher, RpcClient } from '@passlock/shared/dist/rpc/rpc.js';
|
|
3
|
-
import { Effect as E, Layer as L, Layer, LogLevel, Logger, pipe } from 'effect';
|
|
4
|
-
import { describe, expect, test } from 'vitest';
|
|
5
|
-
import { mock } from 'vitest-mock-extended';
|
|
6
|
-
import * as Fixture from './connection.fixture.js';
|
|
7
|
-
import { ConnectionService, ConnectionServiceLive } from './connection.js';
|
|
8
|
-
describe('preConnect should', () => {
|
|
9
|
-
test('hit the rpc endpoint', async () => {
|
|
10
|
-
const assertions = E.gen(function* (_) {
|
|
11
|
-
const service = yield* _(ConnectionService);
|
|
12
|
-
yield* _(service.preConnect());
|
|
13
|
-
const rpcClient = yield* _(RpcClient);
|
|
14
|
-
expect(rpcClient.preConnect).toBeCalledWith(Fixture.preConnectReq);
|
|
15
|
-
const dispatcher = yield* _(Dispatcher);
|
|
16
|
-
expect(dispatcher.get).toBeCalledWith(`/token/token?warm=true`);
|
|
17
|
-
});
|
|
18
|
-
const rpcClientTest = Layer.effect(RpcClient, E.sync(() => {
|
|
19
|
-
const rpcMock = mock();
|
|
20
|
-
rpcMock.preConnect.mockReturnValue(E.succeed(Fixture.preConnectRes));
|
|
21
|
-
return rpcMock;
|
|
22
|
-
}));
|
|
23
|
-
const rpcConfigTest = Layer.succeed(RpcConfig, RpcConfig.of(Fixture.rpcConfig));
|
|
24
|
-
const dispatcherTest = Layer.effect(Dispatcher, E.sync(() => {
|
|
25
|
-
const dispatcherMock = mock();
|
|
26
|
-
dispatcherMock.get.mockReturnValue(E.succeed({}));
|
|
27
|
-
return dispatcherMock;
|
|
28
|
-
}));
|
|
29
|
-
const service = pipe(ConnectionServiceLive, L.provide(rpcClientTest), L.provide(dispatcherTest), L.provide(rpcConfigTest));
|
|
30
|
-
const layers = L.mergeAll(service, rpcClientTest, dispatcherTest);
|
|
31
|
-
const effect = pipe(E.provide(assertions, layers), Logger.withMinimumLogLevel(LogLevel.None));
|
|
32
|
-
return E.runPromise(effect);
|
|
33
|
-
});
|
|
34
|
-
});
|
|
35
|
-
//# sourceMappingURL=connection.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"connection.test.js","sourceRoot":"","sources":["../../src/connection/connection.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAA;AAC/D,OAAO,EAAE,UAAU,EAAE,SAAS,EAAkB,MAAM,kCAAkC,CAAA;AACxF,OAAO,EAAE,MAAM,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAC/E,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AAC3C,OAAO,KAAK,OAAO,MAAM,yBAAyB,CAAA;AAClD,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AAE1E,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,IAAI,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;QACtC,MAAM,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAA;YAC3C,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAA;YAE9B,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;YACrC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA;YAElE,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAA;YACvC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,wBAAwB,CAAC,CAAA;QACjE,CAAC,CAAC,CAAA;QAEF,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAChC,SAAS,EACT,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;YACV,MAAM,OAAO,GAAG,IAAI,EAAa,CAAA;YAEjC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAA;YAEpE,OAAO,OAAO,CAAA;QAChB,CAAC,CAAC,CACH,CAAA;QAED,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAA;QAE/E,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,CACjC,UAAU,EACV,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;YACV,MAAM,cAAc,GAAG,IAAI,EAAsB,CAAA;YAEjD,cAAc,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAA;YAEjD,OAAO,cAAc,CAAA;QACvB,CAAC,CAAC,CACH,CAAA;QAED,MAAM,OAAO,GAAG,IAAI,CAClB,qBAAqB,EACrB,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,EACxB,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,EACzB,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CACzB,CAAA;QAED,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,aAAa,EAAE,cAAc,CAAC,CAAA;QACjE,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,mBAAmB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA;QAE7F,OAAO,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IAC7B,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"email.test.d.ts","sourceRoot":"","sources":["../../src/email/email.test.ts"],"names":[],"mappings":""}
|
package/dist/email/email.test.js
DELETED
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import { RpcClient } from '@passlock/shared/dist/rpc/rpc.js';
|
|
2
|
-
import { Effect as E, Layer as L, LogLevel, Logger, pipe } from 'effect';
|
|
3
|
-
import { NoSuchElementException } from 'effect/Cause';
|
|
4
|
-
import { describe, expect, test } from 'vitest';
|
|
5
|
-
import { mock } from 'vitest-mock-extended';
|
|
6
|
-
import { AuthenticationService } from '../authentication/authenticate.js';
|
|
7
|
-
import { StorageService } from '../storage/storage.js';
|
|
8
|
-
import * as Fixture from './email.fixture.js';
|
|
9
|
-
import { EmailService, EmailServiceLive } from './email.js';
|
|
10
|
-
describe('verifyEmailCode should', () => {
|
|
11
|
-
test('return a principal when the verification is successful', async () => {
|
|
12
|
-
const assertions = E.gen(function* (_) {
|
|
13
|
-
const service = yield* _(EmailService);
|
|
14
|
-
const result = yield* _(service.verifyEmailCode({ code: '123' }));
|
|
15
|
-
expect(result).toEqual(Fixture.principal);
|
|
16
|
-
});
|
|
17
|
-
const service = pipe(EmailServiceLive, L.provide(Fixture.locationSearchTest), L.provide(Fixture.authenticationServiceTest), L.provide(Fixture.storageServiceTest), L.provide(Fixture.rpcClientTest));
|
|
18
|
-
const effect = pipe(E.provide(assertions, service), Logger.withMinimumLogLevel(LogLevel.None));
|
|
19
|
-
return E.runPromise(effect);
|
|
20
|
-
});
|
|
21
|
-
test('check for a token in local storage', async () => {
|
|
22
|
-
const assertions = E.gen(function* (_) {
|
|
23
|
-
const service = yield* _(EmailService);
|
|
24
|
-
yield* _(service.verifyEmailCode({ code: '123' }));
|
|
25
|
-
const storageService = yield* _(StorageService);
|
|
26
|
-
expect(storageService.getToken).toHaveBeenCalledWith('passkey');
|
|
27
|
-
});
|
|
28
|
-
const storageServiceTest = L.effect(StorageService, E.sync(() => {
|
|
29
|
-
const storageServiceMock = mock();
|
|
30
|
-
storageServiceMock.getToken.mockReturnValue(E.succeed(Fixture.storedToken));
|
|
31
|
-
storageServiceMock.clearToken.mockReturnValue(E.void);
|
|
32
|
-
return storageServiceMock;
|
|
33
|
-
}));
|
|
34
|
-
const service = pipe(EmailServiceLive, L.provide(Fixture.locationSearchTest), L.provide(Fixture.authenticationServiceTest), L.provide(storageServiceTest), L.provide(Fixture.rpcClientTest));
|
|
35
|
-
const layers = L.merge(service, storageServiceTest);
|
|
36
|
-
const effect = pipe(E.provide(assertions, layers), Logger.withMinimumLogLevel(LogLevel.None));
|
|
37
|
-
return E.runPromise(effect);
|
|
38
|
-
});
|
|
39
|
-
test('re-authenticate the user if no local token', async () => {
|
|
40
|
-
const assertions = E.gen(function* (_) {
|
|
41
|
-
const service = yield* _(EmailService);
|
|
42
|
-
yield* _(service.verifyEmailCode({ code: '123' }));
|
|
43
|
-
const authService = yield* _(AuthenticationService);
|
|
44
|
-
expect(authService.authenticatePasskey).toHaveBeenCalled();
|
|
45
|
-
});
|
|
46
|
-
const storageServiceTest = L.effect(StorageService, E.sync(() => {
|
|
47
|
-
const storageServiceMock = mock();
|
|
48
|
-
storageServiceMock.getToken.mockReturnValue(E.fail(new NoSuchElementException()));
|
|
49
|
-
storageServiceMock.clearToken.mockReturnValue(E.void);
|
|
50
|
-
return storageServiceMock;
|
|
51
|
-
}));
|
|
52
|
-
const authServiceTest = L.effect(AuthenticationService, E.sync(() => {
|
|
53
|
-
const authServiceMock = mock();
|
|
54
|
-
authServiceMock.authenticatePasskey.mockReturnValue(E.succeed(Fixture.principal));
|
|
55
|
-
return authServiceMock;
|
|
56
|
-
}));
|
|
57
|
-
const service = pipe(EmailServiceLive, L.provide(Fixture.locationSearchTest), L.provide(authServiceTest), L.provide(storageServiceTest), L.provide(Fixture.rpcClientTest));
|
|
58
|
-
const layers = L.mergeAll(service, storageServiceTest, authServiceTest);
|
|
59
|
-
const effect = pipe(E.provide(assertions, layers), Logger.withMinimumLogLevel(LogLevel.None));
|
|
60
|
-
return E.runPromise(effect);
|
|
61
|
-
});
|
|
62
|
-
test('call the backend', async () => {
|
|
63
|
-
const assertions = E.gen(function* (_) {
|
|
64
|
-
const service = yield* _(EmailService);
|
|
65
|
-
yield* _(service.verifyEmailCode({ code: Fixture.code }));
|
|
66
|
-
const rpcClient = yield* _(RpcClient);
|
|
67
|
-
expect(rpcClient.verifyEmail).toHaveBeenCalledWith(Fixture.rpcVerifyEmailReq);
|
|
68
|
-
});
|
|
69
|
-
const rpcClientTest = L.effect(RpcClient, E.sync(() => {
|
|
70
|
-
const rpcMock = mock();
|
|
71
|
-
rpcMock.verifyEmail.mockReturnValue(E.succeed(Fixture.rpcVerifyEmailRes));
|
|
72
|
-
return rpcMock;
|
|
73
|
-
}));
|
|
74
|
-
const service = pipe(EmailServiceLive, L.provide(Fixture.locationSearchTest), L.provide(Fixture.authenticationServiceTest), L.provide(Fixture.storageServiceTest), L.provide(rpcClientTest));
|
|
75
|
-
const layers = L.merge(service, rpcClientTest);
|
|
76
|
-
const effect = pipe(E.provide(assertions, layers), Logger.withMinimumLogLevel(LogLevel.None));
|
|
77
|
-
return E.runPromise(effect);
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
describe('verifyEmailLink should', () => {
|
|
81
|
-
test('extract the code from the current url', async () => {
|
|
82
|
-
const assertions = E.gen(function* (_) {
|
|
83
|
-
const service = yield* _(EmailService);
|
|
84
|
-
yield* _(service.verifyEmailLink());
|
|
85
|
-
const rpcClient = yield* _(RpcClient);
|
|
86
|
-
expect(rpcClient.verifyEmail).toBeCalledWith(Fixture.rpcVerifyEmailReq);
|
|
87
|
-
});
|
|
88
|
-
const rpcClientTest = L.effect(RpcClient, E.sync(() => {
|
|
89
|
-
const rpcMock = mock();
|
|
90
|
-
rpcMock.verifyEmail.mockReturnValue(E.succeed(Fixture.rpcVerifyEmailRes));
|
|
91
|
-
return rpcMock;
|
|
92
|
-
}));
|
|
93
|
-
const service = pipe(EmailServiceLive, L.provide(Fixture.locationSearchTest), L.provide(Fixture.storageServiceTest), L.provide(Fixture.authenticationServiceTest), L.provide(rpcClientTest));
|
|
94
|
-
const layers = L.merge(service, rpcClientTest);
|
|
95
|
-
const effect = pipe(E.provide(assertions, layers), Logger.withMinimumLogLevel(LogLevel.None));
|
|
96
|
-
return E.runPromise(effect);
|
|
97
|
-
});
|
|
98
|
-
});
|
|
99
|
-
//# sourceMappingURL=email.test.js.map
|