@nlabs/reaktor 0.10.0 → 0.10.2
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/.env +1 -0
- package/.env.example +1 -0
- package/DATABASE_I18N_GUIDE.md +434 -0
- package/TEST_UTILITIES_GUIDE.md +360 -0
- package/coverage/actions/index.html +21 -36
- package/coverage/actions/notifications.ts.html +223 -0
- package/coverage/actions/posts.ts.html +2356 -0
- package/coverage/adapters/arangoAdapter.ts.html +170 -20
- package/coverage/adapters/fileAdapter.ts.html +445 -0
- package/coverage/adapters/index.html +72 -42
- package/coverage/adapters/postAdapter.ts.html +436 -0
- package/coverage/adapters/reaktorAdapter.ts.html +201 -18
- package/coverage/adapters/tagAdapter.ts.html +274 -25
- package/coverage/adapters/userAdapter.ts.html +829 -0
- package/coverage/analyticsUtils.ts.html +286 -0
- package/coverage/config.ts.html +766 -0
- package/coverage/index.html +77 -77
- package/coverage/mocks/group.ts.html +5 -5
- package/coverage/mocks/image.ts.html +18 -12
- package/coverage/mocks/index.html +37 -7
- package/coverage/mocks/post.ts.html +8 -8
- package/coverage/mocks/tag.ts.html +2 -2
- package/coverage/mocks/user.ts.html +18 -15
- package/coverage/testUtils.ts.html +1309 -0
- package/coverage/translationQueue.ts.html +592 -0
- package/coverage/types/error.types.ts.html +148 -0
- package/coverage/types/index.html +2 -2
- package/coverage/utils/adapterUtils.ts.html +39 -27
- package/coverage/utils/analyticsUtils.ts.html +35 -41
- package/coverage/utils/authUtils.ts.html +328 -0
- package/coverage/utils/dbI18n.ts.html +280 -0
- package/coverage/utils/googleTranslate.ts.html +385 -0
- package/coverage/utils/index.html +29 -44
- package/coverage/utils/localeUtils.ts.html +193 -0
- package/coverage/utils/sessionUtils.ts.html +211 -0
- package/coverage/utils/testUtils.ts.html +1309 -0
- package/index.js +1 -1
- package/lex.config.mjs +34 -0
- package/lib/actions/apps.d.ts +4 -4
- package/lib/actions/apps.js +17 -239
- package/lib/actions/connections.d.ts +2 -1
- package/lib/actions/connections.js +6 -89
- package/lib/actions/content.d.ts +13 -0
- package/lib/actions/content.js +17 -0
- package/lib/actions/conversations.d.ts +4 -2
- package/lib/actions/conversations.js +19 -336
- package/lib/actions/dynamodb.d.ts +4 -0
- package/lib/actions/dynamodb.js +2 -150
- package/lib/actions/email.d.ts +5 -2
- package/lib/actions/email.js +2 -152
- package/lib/actions/files.d.ts +3 -3
- package/lib/actions/files.js +5 -283
- package/lib/actions/groups.d.ts +4 -5
- package/lib/actions/groups.js +19 -259
- package/lib/actions/images.d.ts +8 -1
- package/lib/actions/images.js +31 -700
- package/lib/actions/index.d.ts +27 -23
- package/lib/actions/index.js +2 -66
- package/lib/actions/ios.d.ts +3 -3
- package/lib/actions/ios.js +9 -162
- package/lib/actions/locations.d.ts +3 -3
- package/lib/actions/locations.js +7 -122
- package/lib/actions/messages.d.ts +3 -4
- package/lib/actions/messages.js +21 -196
- package/lib/actions/notifications.d.ts +5 -1
- package/lib/actions/notifications.js +2 -59
- package/lib/actions/payments.d.ts +3 -1
- package/lib/actions/payments.js +11 -464
- package/lib/actions/posts.d.ts +7 -4
- package/lib/actions/posts.js +75 -527
- package/lib/actions/profiles.d.ts +4 -0
- package/lib/actions/profiles.js +8 -0
- package/lib/actions/reactions.d.ts +3 -1
- package/lib/actions/reactions.js +25 -312
- package/lib/actions/s3.d.ts +4 -0
- package/lib/actions/s3.js +2 -133
- package/lib/actions/search.d.ts +2 -2
- package/lib/actions/search.js +5 -90
- package/lib/actions/sms.d.ts +2 -9
- package/lib/actions/sms.js +2 -108
- package/lib/actions/statistics.d.ts +2 -1
- package/lib/actions/statistics.js +6 -60
- package/lib/actions/{subscription.d.ts → subscriptions.d.ts} +2 -2
- package/lib/actions/subscriptions.js +12 -0
- package/lib/actions/tags.d.ts +3 -3
- package/lib/actions/tags.js +19 -287
- package/lib/actions/users.d.ts +13 -12
- package/lib/actions/users.js +66 -763
- package/lib/actions/websockets.d.ts +2 -2
- package/lib/actions/websockets.js +14 -158
- package/lib/adapters/arangoAdapter.d.ts +7 -1
- package/lib/adapters/arangoAdapter.js +2 -46
- package/lib/adapters/contentAdapter.d.ts +8 -0
- package/lib/adapters/contentAdapter.js +2 -0
- package/lib/adapters/fileAdapter.d.ts +8 -2
- package/lib/adapters/fileAdapter.js +2 -76
- package/lib/adapters/imageAdapter.d.ts +7 -1
- package/lib/adapters/imageAdapter.js +2 -40
- package/lib/adapters/index.d.ts +9 -0
- package/lib/adapters/index.js +2 -0
- package/lib/adapters/messageAdapter.d.ts +7 -1
- package/lib/adapters/messageAdapter.js +2 -49
- package/lib/adapters/postAdapter.d.ts +7 -1
- package/lib/adapters/postAdapter.js +2 -70
- package/lib/adapters/reaktorAdapter.d.ts +16 -6
- package/lib/adapters/reaktorAdapter.js +2 -44
- package/lib/adapters/tagAdapter.d.ts +8 -1
- package/lib/adapters/tagAdapter.js +2 -50
- package/lib/adapters/userAdapter.d.ts +12 -1
- package/lib/adapters/userAdapter.js +2 -115
- package/lib/config.d.ts +43 -6
- package/lib/config.js +2 -125
- package/lib/handlers/graphqlHandler.d.ts +4 -0
- package/lib/handlers/graphqlHandler.js +2 -0
- package/lib/index.d.ts +17 -10
- package/lib/index.js +2 -66
- package/lib/lambdas/actions/websockets.d.ts +3 -3
- package/lib/lambdas/actions/websockets.js +14 -116
- package/lib/lambdas/authorizer.js +2 -67
- package/lib/lambdas/connection.js +2 -91
- package/lib/lambdas/utils/message.js +2 -42
- package/lib/lambdas/utils/websocket.js +2 -105
- package/lib/mocks/conversation.js +2 -35
- package/lib/mocks/file.js +2 -38
- package/lib/mocks/group.js +2 -47
- package/lib/mocks/image.d.ts +1 -1
- package/lib/mocks/image.js +2 -44
- package/lib/mocks/post.js +2 -55
- package/lib/mocks/tag.d.ts +1 -1
- package/lib/mocks/tag.js +2 -37
- package/lib/mocks/user.d.ts +1 -1
- package/lib/mocks/user.js +2 -88
- package/lib/mutations/content.d.ts +2 -0
- package/lib/mutations/content.js +2 -0
- package/lib/mutations/index.d.ts +11 -3
- package/lib/mutations/index.js +2 -26
- package/lib/mutations/locations.d.ts +1 -1
- package/lib/mutations/locations.js +2 -44
- package/lib/mutations/messages.d.ts +1 -1
- package/lib/mutations/messages.js +2 -86
- package/lib/mutations/posts.d.ts +1 -1
- package/lib/mutations/posts.js +2 -53
- package/lib/mutations/profiles.d.ts +2 -0
- package/lib/mutations/profiles.js +2 -0
- package/lib/mutations/reactions.d.ts +1 -1
- package/lib/mutations/reactions.js +2 -51
- package/lib/mutations/statistics.d.ts +1 -1
- package/lib/mutations/statistics.js +2 -39
- package/lib/mutations/subscriptions.d.ts +1 -1
- package/lib/mutations/subscriptions.js +2 -56
- package/lib/mutations/tags.d.ts +1 -1
- package/lib/mutations/tags.js +2 -120
- package/lib/mutations/users.js +2 -116
- package/lib/objectTypes/app.js +2 -173
- package/lib/objectTypes/bankAccount.js +2 -76
- package/lib/objectTypes/connection.js +2 -48
- package/lib/objectTypes/content.d.ts +2 -0
- package/lib/objectTypes/content.js +2 -0
- package/lib/objectTypes/conversation.js +2 -77
- package/lib/objectTypes/creditCard.js +2 -86
- package/lib/objectTypes/document.js +2 -46
- package/lib/objectTypes/error.js +2 -46
- package/lib/objectTypes/external.js +2 -74
- package/lib/objectTypes/file.js +2 -100
- package/lib/objectTypes/filter.js +2 -43
- package/lib/objectTypes/group.js +2 -123
- package/lib/objectTypes/iapSubscription.js +2 -40
- package/lib/objectTypes/image.d.ts +4 -0
- package/lib/objectTypes/image.js +2 -129
- package/lib/objectTypes/index.d.ts +26 -24
- package/lib/objectTypes/index.js +2 -68
- package/lib/objectTypes/location.js +2 -109
- package/lib/objectTypes/message.js +2 -96
- package/lib/objectTypes/passcode.js +2 -42
- package/lib/objectTypes/plan.js +2 -95
- package/lib/objectTypes/post.js +2 -125
- package/lib/objectTypes/profile.d.ts +3 -0
- package/lib/objectTypes/profile.js +2 -0
- package/lib/objectTypes/reaction.js +2 -61
- package/lib/objectTypes/relation.js +2 -49
- package/lib/objectTypes/search.js +2 -72
- package/lib/objectTypes/statistics.js +2 -39
- package/lib/objectTypes/subscription.js +2 -117
- package/lib/objectTypes/tag.js +2 -65
- package/lib/objectTypes/user.js +2 -144
- package/lib/queries/content.d.ts +2 -0
- package/lib/queries/content.js +2 -0
- package/lib/queries/index.d.ts +10 -3
- package/lib/queries/index.js +2 -33
- package/lib/queries/locations.d.ts +1 -1
- package/lib/queries/locations.js +2 -45
- package/lib/queries/messages.d.ts +1 -1
- package/lib/queries/messages.js +2 -52
- package/lib/queries/posts.d.ts +1 -1
- package/lib/queries/posts.js +2 -154
- package/lib/queries/reactions.d.ts +1 -1
- package/lib/queries/reactions.js +2 -56
- package/lib/queries/statistics.d.ts +1 -1
- package/lib/queries/statistics.js +2 -39
- package/lib/queries/subscriptions.d.ts +1 -1
- package/lib/queries/subscriptions.js +2 -44
- package/lib/queries/tags.d.ts +1 -1
- package/lib/queries/tags.js +2 -75
- package/lib/queries/users.js +2 -64
- package/lib/templates/email/layout.js +3 -25
- package/lib/templates/email/passwordForgot.js +3 -25
- package/lib/templates/email/passwordRecovery.js +3 -25
- package/lib/templates/email/verifyEmail.js +3 -25
- package/lib/templates/email/welcome.js +3 -25
- package/lib/templates/sms/passwordForgot.js +2 -24
- package/lib/templates/sms/passwordRecovery.js +2 -24
- package/lib/templates/sms/verifyEmail.js +2 -24
- package/lib/templates/sms/verifyPhone.js +2 -24
- package/lib/templates/sms/welcome.js +2 -24
- package/lib/types/apps.types.d.ts +6 -2
- package/lib/types/apps.types.js +2 -32
- package/lib/types/arangodb.types.d.ts +8 -4
- package/lib/types/arangodb.types.js +1 -16
- package/lib/types/auth.types.d.ts +11 -5
- package/lib/types/auth.types.js +1 -16
- package/lib/types/connections.types.d.ts +5 -1
- package/lib/types/connections.types.js +1 -16
- package/lib/types/content.types.d.ts +31 -0
- package/lib/types/content.types.js +1 -0
- package/lib/types/conversations.types.d.ts +6 -2
- package/lib/types/conversations.types.js +1 -16
- package/lib/types/email.types.d.ts +9 -5
- package/lib/types/email.types.js +1 -16
- package/lib/types/error.types.d.ts +1 -0
- package/lib/types/error.types.js +2 -44
- package/lib/types/files.types.d.ts +5 -1
- package/lib/types/files.types.js +1 -16
- package/lib/types/google.types.d.ts +4 -0
- package/lib/types/google.types.js +1 -16
- package/lib/types/groups.types.d.ts +5 -1
- package/lib/types/groups.types.js +1 -16
- package/lib/types/images.types.d.ts +6 -2
- package/lib/types/images.types.js +1 -16
- package/lib/types/index.d.ts +26 -20
- package/lib/types/index.js +2 -60
- package/lib/types/locations.types.d.ts +5 -1
- package/lib/types/locations.types.js +1 -16
- package/lib/types/messages.types.d.ts +7 -3
- package/lib/types/messages.types.js +1 -16
- package/lib/types/notifications.types.d.ts +9 -5
- package/lib/types/notifications.types.js +1 -16
- package/lib/types/payments.types.d.ts +5 -1
- package/lib/types/payments.types.js +1 -16
- package/lib/types/posts.types.d.ts +7 -3
- package/lib/types/posts.types.js +1 -16
- package/lib/types/{personas.types.d.ts → profiles.types.d.ts} +3 -15
- package/lib/types/profiles.types.js +1 -0
- package/lib/types/statistics.types.js +1 -16
- package/lib/types/tags.types.d.ts +5 -1
- package/lib/types/tags.types.js +1 -16
- package/lib/types/users.types.d.ts +41 -10
- package/lib/types/users.types.js +1 -16
- package/lib/types/websockets.types.d.ts +5 -1
- package/lib/types/websockets.types.js +1 -16
- package/lib/utils/adapterUtils.d.ts +4 -0
- package/lib/utils/adapterUtils.js +2 -45
- package/lib/utils/analyticsUtils.d.ts +5 -1
- package/lib/utils/analyticsUtils.js +2 -72
- package/lib/utils/arangodbUtils.d.ts +6 -2
- package/lib/utils/arangodbUtils.js +5 -163
- package/lib/utils/{auth.d.ts → authUtils.d.ts} +3 -1
- package/lib/utils/authUtils.js +2 -0
- package/lib/utils/contextUtils.d.ts +3 -0
- package/lib/utils/contextUtils.js +2 -0
- package/lib/utils/dbI18n.d.ts +10 -0
- package/lib/utils/dbI18n.example.d.ts +20 -0
- package/lib/utils/dbI18n.example.js +6 -0
- package/lib/utils/dbI18n.js +2 -0
- package/lib/utils/googleTranslate.d.ts +6 -0
- package/lib/utils/googleTranslate.js +2 -0
- package/lib/utils/graphqlUtils.d.ts +10 -0
- package/lib/utils/graphqlUtils.js +2 -0
- package/lib/utils/index.d.ts +18 -5
- package/lib/utils/index.js +2 -30
- package/lib/utils/languageDetection.d.ts +8 -0
- package/lib/utils/languageDetection.js +2 -0
- package/lib/utils/localeUtils.d.ts +11 -0
- package/lib/utils/localeUtils.example.d.ts +5 -0
- package/lib/utils/localeUtils.example.js +2 -0
- package/lib/utils/localeUtils.js +2 -0
- package/lib/utils/middlewareUtils.d.ts +2 -0
- package/lib/utils/middlewareUtils.js +2 -0
- package/lib/utils/{session.d.ts → sessionUtils.d.ts} +1 -1
- package/lib/utils/sessionUtils.js +2 -0
- package/lib/utils/stripeUtils.d.ts +7 -3
- package/lib/utils/stripeUtils.js +2 -43
- package/lib/utils/templateUtils.d.ts +3 -0
- package/lib/utils/templateUtils.js +2 -0
- package/lib/utils/testUtils.d.ts +95 -0
- package/lib/utils/testUtils.js +2 -0
- package/lib/utils/translationQueue.d.ts +29 -0
- package/lib/utils/translationQueue.example.d.ts +33 -0
- package/lib/utils/translationQueue.example.js +2 -0
- package/lib/utils/translationQueue.js +2 -0
- package/package.json +32 -28
- package/tsconfig.build.json +21 -0
- package/tsconfig.lint.json +33 -0
- package/tsconfig.test.json +31 -0
- package/.prettierrc.js +0 -4
- package/dist/actions/apps.js +0 -242
- package/dist/actions/connections.js +0 -90
- package/dist/actions/conversations.js +0 -350
- package/dist/actions/dynamodb.js +0 -150
- package/dist/actions/email.js +0 -152
- package/dist/actions/files.js +0 -283
- package/dist/actions/groups.js +0 -292
- package/dist/actions/images.js +0 -735
- package/dist/actions/index.js +0 -66
- package/dist/actions/ios.js +0 -164
- package/dist/actions/locations.js +0 -122
- package/dist/actions/messages.js +0 -208
- package/dist/actions/notifications.js +0 -59
- package/dist/actions/payments.js +0 -497
- package/dist/actions/personas.js +0 -110
- package/dist/actions/posts.js +0 -595
- package/dist/actions/reactions.js +0 -322
- package/dist/actions/s3.js +0 -133
- package/dist/actions/search.js +0 -90
- package/dist/actions/sms.js +0 -108
- package/dist/actions/statistics.js +0 -62
- package/dist/actions/subscription.js +0 -220
- package/dist/actions/tags.js +0 -292
- package/dist/actions/users.js +0 -784
- package/dist/actions/websockets.js +0 -174
- package/dist/adapters/arangoAdapter.js +0 -46
- package/dist/adapters/fileAdapter.js +0 -76
- package/dist/adapters/imageAdapter.js +0 -40
- package/dist/adapters/messageAdapter.js +0 -49
- package/dist/adapters/postAdapter.js +0 -70
- package/dist/adapters/reaktorAdapter.js +0 -44
- package/dist/adapters/tagAdapter.js +0 -50
- package/dist/adapters/userAdapter.js +0 -115
- package/dist/config.js +0 -125
- package/dist/index.js +0 -66
- package/dist/lambdas/actions/websockets.js +0 -132
- package/dist/lambdas/authorizer.js +0 -67
- package/dist/lambdas/connection.js +0 -91
- package/dist/lambdas/utils/message.js +0 -42
- package/dist/lambdas/utils/websocket.js +0 -105
- package/dist/mocks/conversation.js +0 -35
- package/dist/mocks/file.js +0 -38
- package/dist/mocks/group.js +0 -47
- package/dist/mocks/image.js +0 -44
- package/dist/mocks/nlabs.png +0 -0
- package/dist/mocks/post.js +0 -55
- package/dist/mocks/tag.js +0 -37
- package/dist/mocks/user.js +0 -88
- package/dist/mutations/index.js +0 -26
- package/dist/mutations/locations.js +0 -44
- package/dist/mutations/messages.js +0 -86
- package/dist/mutations/personas.js +0 -100
- package/dist/mutations/posts.js +0 -53
- package/dist/mutations/reactions.js +0 -51
- package/dist/mutations/statistics.js +0 -39
- package/dist/mutations/subscriptions.js +0 -56
- package/dist/mutations/tags.js +0 -120
- package/dist/mutations/users.js +0 -116
- package/dist/objectTypes/app.js +0 -173
- package/dist/objectTypes/bankAccount.js +0 -76
- package/dist/objectTypes/connection.js +0 -48
- package/dist/objectTypes/conversation.js +0 -77
- package/dist/objectTypes/creditCard.js +0 -86
- package/dist/objectTypes/document.js +0 -46
- package/dist/objectTypes/error.js +0 -46
- package/dist/objectTypes/external.js +0 -74
- package/dist/objectTypes/file.js +0 -100
- package/dist/objectTypes/filter.js +0 -43
- package/dist/objectTypes/group.js +0 -123
- package/dist/objectTypes/iapSubscription.js +0 -40
- package/dist/objectTypes/image.js +0 -129
- package/dist/objectTypes/index.js +0 -68
- package/dist/objectTypes/location.js +0 -109
- package/dist/objectTypes/message.js +0 -96
- package/dist/objectTypes/passcode.js +0 -42
- package/dist/objectTypes/persona.js +0 -87
- package/dist/objectTypes/plan.js +0 -95
- package/dist/objectTypes/post.js +0 -125
- package/dist/objectTypes/reaction.js +0 -61
- package/dist/objectTypes/relation.js +0 -49
- package/dist/objectTypes/search.js +0 -72
- package/dist/objectTypes/statistics.js +0 -39
- package/dist/objectTypes/subscription.js +0 -117
- package/dist/objectTypes/tag.js +0 -65
- package/dist/objectTypes/user.js +0 -144
- package/dist/queries/index.js +0 -33
- package/dist/queries/locations.js +0 -45
- package/dist/queries/messages.js +0 -52
- package/dist/queries/posts.js +0 -154
- package/dist/queries/reactions.js +0 -56
- package/dist/queries/statistics.js +0 -39
- package/dist/queries/subscriptions.js +0 -44
- package/dist/queries/tags.js +0 -75
- package/dist/queries/users.js +0 -64
- package/dist/templates/email/layout.js +0 -302
- package/dist/templates/email/passwordForgot.js +0 -38
- package/dist/templates/email/passwordRecovery.js +0 -35
- package/dist/templates/email/verifyEmail.js +0 -38
- package/dist/templates/email/welcome.js +0 -38
- package/dist/templates/sms/passwordForgot.js +0 -24
- package/dist/templates/sms/passwordRecovery.js +0 -24
- package/dist/templates/sms/verifyEmail.js +0 -24
- package/dist/templates/sms/verifyPhone.js +0 -24
- package/dist/templates/sms/welcome.js +0 -24
- package/dist/types/apps.js +0 -32
- package/dist/types/arangodb.js +0 -16
- package/dist/types/auth.js +0 -16
- package/dist/types/connections.js +0 -16
- package/dist/types/conversations.js +0 -16
- package/dist/types/email.js +0 -16
- package/dist/types/error.js +0 -44
- package/dist/types/files.js +0 -16
- package/dist/types/google.js +0 -16
- package/dist/types/groups.js +0 -16
- package/dist/types/images.js +0 -16
- package/dist/types/index.js +0 -60
- package/dist/types/locations.js +0 -16
- package/dist/types/messages.js +0 -16
- package/dist/types/notifications.js +0 -16
- package/dist/types/payments.js +0 -16
- package/dist/types/personas.js +0 -16
- package/dist/types/posts.js +0 -16
- package/dist/types/statistics.js +0 -16
- package/dist/types/tags.js +0 -16
- package/dist/types/users.js +0 -16
- package/dist/types/websockets.js +0 -16
- package/dist/utils/adapterUtils.js +0 -45
- package/dist/utils/analyticsUtils.js +0 -72
- package/dist/utils/arangodbUtils.js +0 -165
- package/dist/utils/auth.js +0 -57
- package/dist/utils/index.js +0 -30
- package/dist/utils/session.js +0 -60
- package/jest.setup.js +0 -0
- package/lex.config.cjs +0 -13
- package/lib/actions/personas.d.ts +0 -3
- package/lib/actions/personas.js +0 -110
- package/lib/actions/subscription.js +0 -208
- package/lib/mutations/personas.d.ts +0 -2
- package/lib/mutations/personas.js +0 -100
- package/lib/objectTypes/persona.d.ts +0 -3
- package/lib/objectTypes/persona.js +0 -87
- package/lib/types/personas.types.js +0 -16
- package/lib/utils/auth.js +0 -57
- package/lib/utils/session.js +0 -60
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
# Test Utilities Guide
|
|
2
|
+
|
|
3
|
+
This guide explains how to use the test utilities in `src/utils/testUtils.ts` to optimize and consolidate your GraphQL query and mutation tests.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
The test utilities provide a standardized way to create tests for GraphQL resolvers, reducing code duplication and improving maintainability. They abstract common testing patterns into reusable functions.
|
|
8
|
+
|
|
9
|
+
## Available Utilities
|
|
10
|
+
|
|
11
|
+
### 1. Mock Context and Resolve Info
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
import { createMockContext, createMockResolveInfo } from '../utils/testUtils';
|
|
15
|
+
|
|
16
|
+
// Create a standard mock context
|
|
17
|
+
const context = createMockContext();
|
|
18
|
+
|
|
19
|
+
// Create a custom context with overrides
|
|
20
|
+
const customContext = createMockContext({
|
|
21
|
+
databaseName: 'custom-db',
|
|
22
|
+
session: { userId: 'custom-user' }
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
// Create mock resolve info for GraphQL resolvers
|
|
26
|
+
const resolveInfo = createMockResolveInfo('fieldName');
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### 2. Mock Data Generators
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
import {
|
|
33
|
+
createMockUser,
|
|
34
|
+
createMockPost,
|
|
35
|
+
createMockMessage,
|
|
36
|
+
createMockReaction,
|
|
37
|
+
createMockTag
|
|
38
|
+
} from '../utils/testUtils';
|
|
39
|
+
|
|
40
|
+
// Create mock data with defaults
|
|
41
|
+
const user = createMockUser();
|
|
42
|
+
const post = createMockPost();
|
|
43
|
+
|
|
44
|
+
// Create mock data with custom values
|
|
45
|
+
const customUser = createMockUser({
|
|
46
|
+
userId: 'custom-id',
|
|
47
|
+
email: 'custom@example.com'
|
|
48
|
+
});
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### 3. Mock Setup Utilities
|
|
52
|
+
|
|
53
|
+
```typescript
|
|
54
|
+
import { mockActionsModule, mockObjectType, setupCommonMocks } from '../utils/testUtils';
|
|
55
|
+
|
|
56
|
+
// Mock actions module
|
|
57
|
+
mockActionsModule('../actions/users', {
|
|
58
|
+
getUser: jest.fn(),
|
|
59
|
+
getSessionUser: jest.fn()
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
// Mock object types
|
|
63
|
+
mockObjectType('../objectTypes/user', 'user');
|
|
64
|
+
|
|
65
|
+
// Setup common mocks (auth utils, etc.)
|
|
66
|
+
setupCommonMocks();
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Test Suite Creators
|
|
70
|
+
|
|
71
|
+
### 1. Query Test Suite
|
|
72
|
+
|
|
73
|
+
Use `createQueryTestSuite` for testing GraphQL query resolvers:
|
|
74
|
+
|
|
75
|
+
```typescript
|
|
76
|
+
import { createQueryTestSuite, createMockUser } from '../utils/testUtils';
|
|
77
|
+
|
|
78
|
+
// Mock dependencies
|
|
79
|
+
mockActionsModule('../actions/users', {
|
|
80
|
+
getUser: jest.fn(),
|
|
81
|
+
getSessionUser: jest.fn()
|
|
82
|
+
});
|
|
83
|
+
mockObjectType('../objectTypes/user', 'user');
|
|
84
|
+
|
|
85
|
+
// Define test cases
|
|
86
|
+
const testCases = [
|
|
87
|
+
{
|
|
88
|
+
name: 'getUserByEmail',
|
|
89
|
+
actionName: 'getUser',
|
|
90
|
+
args: { email: 'test@example.com' },
|
|
91
|
+
expectedCall: (context: any, args: any) => ({ email: args.email }),
|
|
92
|
+
mockReturnValue: createMockUser(),
|
|
93
|
+
errorCase: true
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
name: 'getUserById',
|
|
97
|
+
actionName: 'getUser',
|
|
98
|
+
args: { userId: 'user1' },
|
|
99
|
+
expectedCall: (context: any, args: any) => ({ userId: args.userId }),
|
|
100
|
+
mockReturnValue: createMockUser(),
|
|
101
|
+
errorCase: true
|
|
102
|
+
}
|
|
103
|
+
];
|
|
104
|
+
|
|
105
|
+
// Create the test suite
|
|
106
|
+
createQueryTestSuite(
|
|
107
|
+
'User Queries',
|
|
108
|
+
'../actions/users',
|
|
109
|
+
'../objectTypes/user',
|
|
110
|
+
'user',
|
|
111
|
+
testCases
|
|
112
|
+
);
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### 2. Mutation Test Suite
|
|
116
|
+
|
|
117
|
+
Use `createMutationTestSuite` for testing GraphQL mutation resolvers:
|
|
118
|
+
|
|
119
|
+
```typescript
|
|
120
|
+
import { createMutationTestSuite, createMockUser, setupCommonMocks } from '../utils/testUtils';
|
|
121
|
+
|
|
122
|
+
// Setup common mocks
|
|
123
|
+
setupCommonMocks();
|
|
124
|
+
|
|
125
|
+
// Mock mutations module (complex setup)
|
|
126
|
+
jest.mock('./users', () => ({
|
|
127
|
+
userMutations: {
|
|
128
|
+
getField: jest.fn((fieldName) => ({
|
|
129
|
+
resolve: jest.fn(async (context, args) => {
|
|
130
|
+
const actions = require('../actions/users');
|
|
131
|
+
return await actions[fieldName](context, args);
|
|
132
|
+
})
|
|
133
|
+
}))
|
|
134
|
+
}
|
|
135
|
+
}));
|
|
136
|
+
|
|
137
|
+
// Define test cases
|
|
138
|
+
const testCases = [
|
|
139
|
+
{
|
|
140
|
+
name: 'addUser',
|
|
141
|
+
actionName: 'addUser',
|
|
142
|
+
args: { username: 'testuser', email: 'test@example.com' },
|
|
143
|
+
expectedCall: (context: any, args: any) => args,
|
|
144
|
+
mockReturnValue: createMockUser()
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
name: 'deactivateUser',
|
|
148
|
+
actionName: 'deactivateUser',
|
|
149
|
+
args: { userId: 'user1' },
|
|
150
|
+
expectedCall: (context: any, args: any) => args,
|
|
151
|
+
mockReturnValue: createMockUser(),
|
|
152
|
+
requiresAuth: true,
|
|
153
|
+
authUserId: 'user1'
|
|
154
|
+
}
|
|
155
|
+
];
|
|
156
|
+
|
|
157
|
+
// Create the test suite
|
|
158
|
+
createMutationTestSuite(
|
|
159
|
+
'User',
|
|
160
|
+
'../actions/users',
|
|
161
|
+
'./users',
|
|
162
|
+
testCases
|
|
163
|
+
);
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### 3. Integration Test Suite
|
|
167
|
+
|
|
168
|
+
Use `createIntegrationTestSuite` for testing integration scenarios:
|
|
169
|
+
|
|
170
|
+
```typescript
|
|
171
|
+
import { createIntegrationTestSuite, createMockUser } from '../utils/testUtils';
|
|
172
|
+
|
|
173
|
+
// Define test cases
|
|
174
|
+
const testCases = [
|
|
175
|
+
{
|
|
176
|
+
name: 'getUserByEmail',
|
|
177
|
+
actionName: 'getUser',
|
|
178
|
+
args: { email: 'test@example.com' },
|
|
179
|
+
expectedCall: (context: any, args: any) => ({ email: args.email }),
|
|
180
|
+
successReturnValue: createMockUser(),
|
|
181
|
+
errorReturnValue: null,
|
|
182
|
+
testErrorCase: true
|
|
183
|
+
}
|
|
184
|
+
];
|
|
185
|
+
|
|
186
|
+
// Create the integration test suite
|
|
187
|
+
createIntegrationTestSuite(
|
|
188
|
+
'User',
|
|
189
|
+
'../actions/users',
|
|
190
|
+
'../objectTypes/user',
|
|
191
|
+
'user',
|
|
192
|
+
testCases
|
|
193
|
+
);
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
## Test Case Configuration
|
|
197
|
+
|
|
198
|
+
### Query Test Cases
|
|
199
|
+
|
|
200
|
+
```typescript
|
|
201
|
+
{
|
|
202
|
+
name: string; // Test name
|
|
203
|
+
actionName: string; // Action function name
|
|
204
|
+
args: any; // Arguments to pass
|
|
205
|
+
expectedCall: (context: any, args: any) => any; // Expected call parameters
|
|
206
|
+
mockReturnValue?: any; // Mock return value
|
|
207
|
+
errorCase?: boolean; // Whether to test error handling
|
|
208
|
+
}
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### Mutation Test Cases
|
|
212
|
+
|
|
213
|
+
```typescript
|
|
214
|
+
{
|
|
215
|
+
name: string; // Test name
|
|
216
|
+
actionName: string; // Action function name
|
|
217
|
+
args: any; // Arguments to pass
|
|
218
|
+
expectedCall: (context: any, args: any) => any; // Expected call parameters
|
|
219
|
+
mockReturnValue?: any; // Mock return value
|
|
220
|
+
requiresAuth?: boolean; // Whether authentication is required
|
|
221
|
+
authUserId?: string; // User ID for auth check
|
|
222
|
+
errorCase?: boolean; // Whether to test error handling
|
|
223
|
+
}
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
### Integration Test Cases
|
|
227
|
+
|
|
228
|
+
```typescript
|
|
229
|
+
{
|
|
230
|
+
name: string; // Test name
|
|
231
|
+
actionName: string; // Action function name
|
|
232
|
+
args: any; // Arguments to pass
|
|
233
|
+
expectedCall: (context: any, args: any) => any; // Expected call parameters
|
|
234
|
+
successReturnValue?: any; // Success case return value
|
|
235
|
+
errorReturnValue?: any; // Error case return value
|
|
236
|
+
testErrorCase?: boolean; // Whether to test error scenarios
|
|
237
|
+
}
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
## Migration Guide
|
|
241
|
+
|
|
242
|
+
### From Manual Tests to Utilities
|
|
243
|
+
|
|
244
|
+
**Before (Manual):**
|
|
245
|
+
```typescript
|
|
246
|
+
describe('User Queries', () => {
|
|
247
|
+
const mockContext = {
|
|
248
|
+
databaseName: 'test',
|
|
249
|
+
session: { userId: 'user1', username: 'testuser', userAccess: 1 }
|
|
250
|
+
};
|
|
251
|
+
|
|
252
|
+
beforeEach(() => {
|
|
253
|
+
jest.clearAllMocks();
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
describe('getUserByEmail', () => {
|
|
257
|
+
it('should call getUser action with email parameter', async () => {
|
|
258
|
+
const mockUser = { userId: 'user1', email: 'test@example.com' };
|
|
259
|
+
const { getUser } = require('../actions/users');
|
|
260
|
+
getUser.mockResolvedValue(mockUser);
|
|
261
|
+
|
|
262
|
+
const result = await getUser(mockContext, { email: 'test@example.com' });
|
|
263
|
+
|
|
264
|
+
expect(getUser).toHaveBeenCalledWith(mockContext, { email: 'test@example.com' });
|
|
265
|
+
expect(result).toEqual(mockUser);
|
|
266
|
+
});
|
|
267
|
+
});
|
|
268
|
+
});
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
**After (Using Utilities):**
|
|
272
|
+
```typescript
|
|
273
|
+
import { createQueryTestSuite, createMockUser } from '../utils/testUtils';
|
|
274
|
+
|
|
275
|
+
const testCases = [
|
|
276
|
+
{
|
|
277
|
+
name: 'getUserByEmail',
|
|
278
|
+
actionName: 'getUser',
|
|
279
|
+
args: { email: 'test@example.com' },
|
|
280
|
+
expectedCall: (context: any, args: any) => ({ email: args.email }),
|
|
281
|
+
mockReturnValue: createMockUser()
|
|
282
|
+
}
|
|
283
|
+
];
|
|
284
|
+
|
|
285
|
+
createQueryTestSuite('User Queries', '../actions/users', '../objectTypes/user', 'user', testCases);
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
## Benefits
|
|
289
|
+
|
|
290
|
+
1. **Reduced Code Duplication**: Common test patterns are abstracted into reusable functions
|
|
291
|
+
2. **Consistent Testing**: All tests follow the same structure and patterns
|
|
292
|
+
3. **Easier Maintenance**: Changes to test patterns only need to be made in one place
|
|
293
|
+
4. **Better Readability**: Test intentions are clearer with declarative test case definitions
|
|
294
|
+
5. **Faster Development**: New tests can be created quickly by defining test cases
|
|
295
|
+
|
|
296
|
+
## Best Practices
|
|
297
|
+
|
|
298
|
+
1. **Use Descriptive Names**: Make test case names clear and descriptive
|
|
299
|
+
2. **Group Related Tests**: Use the suite name to group related functionality
|
|
300
|
+
3. **Test Both Success and Error Cases**: Include error handling tests where appropriate
|
|
301
|
+
4. **Use Mock Data Generators**: Use the provided mock data generators for consistent test data
|
|
302
|
+
5. **Keep Test Cases Focused**: Each test case should test one specific scenario
|
|
303
|
+
|
|
304
|
+
## Example: Complete Optimized Test File
|
|
305
|
+
|
|
306
|
+
```typescript
|
|
307
|
+
import {
|
|
308
|
+
createQueryTestSuite,
|
|
309
|
+
createMockUser,
|
|
310
|
+
mockActionsModule,
|
|
311
|
+
mockObjectType
|
|
312
|
+
} from '../utils/testUtils';
|
|
313
|
+
|
|
314
|
+
// Mock dependencies
|
|
315
|
+
mockActionsModule('../actions/users', {
|
|
316
|
+
getUser: jest.fn(),
|
|
317
|
+
getSessionUser: jest.fn()
|
|
318
|
+
});
|
|
319
|
+
|
|
320
|
+
mockObjectType('../objectTypes/user', 'user');
|
|
321
|
+
|
|
322
|
+
// Define test cases
|
|
323
|
+
const userQueryTestCases = [
|
|
324
|
+
{
|
|
325
|
+
name: 'getUserByEmail',
|
|
326
|
+
actionName: 'getUser',
|
|
327
|
+
args: { email: 'test@example.com' },
|
|
328
|
+
expectedCall: (context: any, args: any) => ({ email: args.email }),
|
|
329
|
+
mockReturnValue: createMockUser(),
|
|
330
|
+
errorCase: true
|
|
331
|
+
},
|
|
332
|
+
{
|
|
333
|
+
name: 'getUserById',
|
|
334
|
+
actionName: 'getUser',
|
|
335
|
+
args: { userId: 'user1' },
|
|
336
|
+
expectedCall: (context: any, args: any) => ({ userId: args.userId }),
|
|
337
|
+
mockReturnValue: createMockUser(),
|
|
338
|
+
errorCase: true
|
|
339
|
+
},
|
|
340
|
+
{
|
|
341
|
+
name: 'getUserBySession',
|
|
342
|
+
actionName: 'getSessionUser',
|
|
343
|
+
args: {},
|
|
344
|
+
expectedCall: (context: any, args: any) => ({}),
|
|
345
|
+
mockReturnValue: createMockUser(),
|
|
346
|
+
errorCase: true
|
|
347
|
+
}
|
|
348
|
+
];
|
|
349
|
+
|
|
350
|
+
// Create the test suite
|
|
351
|
+
createQueryTestSuite(
|
|
352
|
+
'User Queries',
|
|
353
|
+
'../actions/users',
|
|
354
|
+
'../objectTypes/user',
|
|
355
|
+
'user',
|
|
356
|
+
userQueryTestCases
|
|
357
|
+
);
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
This approach reduces the original 130-line test file to just 40 lines while maintaining the same test coverage and functionality.
|
|
@@ -23,30 +23,30 @@
|
|
|
23
23
|
<div class='clearfix'>
|
|
24
24
|
|
|
25
25
|
<div class='fl pad1y space-right2'>
|
|
26
|
-
<span class="strong">
|
|
26
|
+
<span class="strong">97% </span>
|
|
27
27
|
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>
|
|
28
|
+
<span class='fraction'>227/234</span>
|
|
29
29
|
</div>
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
<div class='fl pad1y space-right2'>
|
|
33
|
-
<span class="strong">
|
|
33
|
+
<span class="strong">83.89% </span>
|
|
34
34
|
<span class="quiet">Branches</span>
|
|
35
|
-
<span class='fraction'>
|
|
35
|
+
<span class='fraction'>99/118</span>
|
|
36
36
|
</div>
|
|
37
37
|
|
|
38
38
|
|
|
39
39
|
<div class='fl pad1y space-right2'>
|
|
40
|
-
<span class="strong">
|
|
40
|
+
<span class="strong">98.03% </span>
|
|
41
41
|
<span class="quiet">Functions</span>
|
|
42
|
-
<span class='fraction'>
|
|
42
|
+
<span class='fraction'>50/51</span>
|
|
43
43
|
</div>
|
|
44
44
|
|
|
45
45
|
|
|
46
46
|
<div class='fl pad1y space-right2'>
|
|
47
|
-
<span class="strong">
|
|
47
|
+
<span class="strong">96.95% </span>
|
|
48
48
|
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>
|
|
49
|
+
<span class='fraction'>223/230</span>
|
|
50
50
|
</div>
|
|
51
51
|
|
|
52
52
|
|
|
@@ -61,7 +61,7 @@
|
|
|
61
61
|
</div>
|
|
62
62
|
</template>
|
|
63
63
|
</div>
|
|
64
|
-
<div class='status-line
|
|
64
|
+
<div class='status-line high'></div>
|
|
65
65
|
<div class="pad1">
|
|
66
66
|
<table class="coverage-summary">
|
|
67
67
|
<thead>
|
|
@@ -79,33 +79,18 @@
|
|
|
79
79
|
</tr>
|
|
80
80
|
</thead>
|
|
81
81
|
<tbody><tr>
|
|
82
|
-
<td class="file high" data-value="
|
|
83
|
-
<td data-value="
|
|
84
|
-
<div class="chart"><div class="cover-fill" style="width:
|
|
82
|
+
<td class="file high" data-value="posts.ts"><a href="posts.ts.html">posts.ts</a></td>
|
|
83
|
+
<td data-value="97" class="pic high">
|
|
84
|
+
<div class="chart"><div class="cover-fill" style="width: 97%"></div><div class="cover-empty" style="width: 3%"></div></div>
|
|
85
85
|
</td>
|
|
86
|
-
<td data-value="
|
|
87
|
-
<td data-value="
|
|
88
|
-
<td data-value="
|
|
89
|
-
<td data-value="
|
|
90
|
-
<td data-value="
|
|
91
|
-
<td data-value="
|
|
92
|
-
<td data-value="
|
|
93
|
-
<td data-value="
|
|
94
|
-
</tr>
|
|
95
|
-
|
|
96
|
-
<tr>
|
|
97
|
-
<td class="file low" data-value="tags.ts"><a href="tags.ts.html">tags.ts</a></td>
|
|
98
|
-
<td data-value="21.91" class="pic low">
|
|
99
|
-
<div class="chart"><div class="cover-fill" style="width: 21%"></div><div class="cover-empty" style="width: 79%"></div></div>
|
|
100
|
-
</td>
|
|
101
|
-
<td data-value="21.91" class="pct low">21.91%</td>
|
|
102
|
-
<td data-value="146" class="abs low">32/146</td>
|
|
103
|
-
<td data-value="0" class="pct low">0%</td>
|
|
104
|
-
<td data-value="14" class="abs low">0/14</td>
|
|
105
|
-
<td data-value="4.44" class="pct low">4.44%</td>
|
|
106
|
-
<td data-value="45" class="abs low">2/45</td>
|
|
107
|
-
<td data-value="15.15" class="pct low">15.15%</td>
|
|
108
|
-
<td data-value="132" class="abs low">20/132</td>
|
|
86
|
+
<td data-value="97" class="pct high">97%</td>
|
|
87
|
+
<td data-value="234" class="abs high">227/234</td>
|
|
88
|
+
<td data-value="83.89" class="pct high">83.89%</td>
|
|
89
|
+
<td data-value="118" class="abs high">99/118</td>
|
|
90
|
+
<td data-value="98.03" class="pct high">98.03%</td>
|
|
91
|
+
<td data-value="51" class="abs high">50/51</td>
|
|
92
|
+
<td data-value="96.95" class="pct high">96.95%</td>
|
|
93
|
+
<td data-value="230" class="abs high">223/230</td>
|
|
109
94
|
</tr>
|
|
110
95
|
|
|
111
96
|
</tbody>
|
|
@@ -116,7 +101,7 @@
|
|
|
116
101
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
117
102
|
Code coverage generated by
|
|
118
103
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
119
|
-
at 2025-
|
|
104
|
+
at 2025-08-12T16:14:39.389Z
|
|
120
105
|
</div>
|
|
121
106
|
<script src="../prettify.js"></script>
|
|
122
107
|
<script>
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>Code coverage report for actions/notifications.ts</title>
|
|
7
|
+
<meta charset="utf-8" />
|
|
8
|
+
<link rel="stylesheet" href="../prettify.css" />
|
|
9
|
+
<link rel="stylesheet" href="../base.css" />
|
|
10
|
+
<link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
|
|
11
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
12
|
+
<style type='text/css'>
|
|
13
|
+
.coverage-summary .sorter {
|
|
14
|
+
background-image: url(../sort-arrow-sprite.png);
|
|
15
|
+
}
|
|
16
|
+
</style>
|
|
17
|
+
</head>
|
|
18
|
+
|
|
19
|
+
<body>
|
|
20
|
+
<div class='wrapper'>
|
|
21
|
+
<div class='pad1'>
|
|
22
|
+
<h1><a href="../index.html">All files</a> / <a href="index.html">actions</a> notifications.ts</h1>
|
|
23
|
+
<div class='clearfix'>
|
|
24
|
+
|
|
25
|
+
<div class='fl pad1y space-right2'>
|
|
26
|
+
<span class="strong">100% </span>
|
|
27
|
+
<span class="quiet">Statements</span>
|
|
28
|
+
<span class='fraction'>18/18</span>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<div class='fl pad1y space-right2'>
|
|
33
|
+
<span class="strong">100% </span>
|
|
34
|
+
<span class="quiet">Branches</span>
|
|
35
|
+
<span class='fraction'>4/4</span>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
<div class='fl pad1y space-right2'>
|
|
40
|
+
<span class="strong">100% </span>
|
|
41
|
+
<span class="quiet">Functions</span>
|
|
42
|
+
<span class='fraction'>3/3</span>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<div class='fl pad1y space-right2'>
|
|
47
|
+
<span class="strong">100% </span>
|
|
48
|
+
<span class="quiet">Lines</span>
|
|
49
|
+
<span class='fraction'>17/17</span>
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
</div>
|
|
54
|
+
<p class="quiet">
|
|
55
|
+
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
|
|
56
|
+
</p>
|
|
57
|
+
<template id="filterTemplate">
|
|
58
|
+
<div class="quiet">
|
|
59
|
+
Filter:
|
|
60
|
+
<input type="search" id="fileSearch">
|
|
61
|
+
</div>
|
|
62
|
+
</template>
|
|
63
|
+
</div>
|
|
64
|
+
<div class='status-line high'></div>
|
|
65
|
+
<pre><table class="coverage">
|
|
66
|
+
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
|
|
67
|
+
<a name='L2'></a><a href='#L2'>2</a>
|
|
68
|
+
<a name='L3'></a><a href='#L3'>3</a>
|
|
69
|
+
<a name='L4'></a><a href='#L4'>4</a>
|
|
70
|
+
<a name='L5'></a><a href='#L5'>5</a>
|
|
71
|
+
<a name='L6'></a><a href='#L6'>6</a>
|
|
72
|
+
<a name='L7'></a><a href='#L7'>7</a>
|
|
73
|
+
<a name='L8'></a><a href='#L8'>8</a>
|
|
74
|
+
<a name='L9'></a><a href='#L9'>9</a>
|
|
75
|
+
<a name='L10'></a><a href='#L10'>10</a>
|
|
76
|
+
<a name='L11'></a><a href='#L11'>11</a>
|
|
77
|
+
<a name='L12'></a><a href='#L12'>12</a>
|
|
78
|
+
<a name='L13'></a><a href='#L13'>13</a>
|
|
79
|
+
<a name='L14'></a><a href='#L14'>14</a>
|
|
80
|
+
<a name='L15'></a><a href='#L15'>15</a>
|
|
81
|
+
<a name='L16'></a><a href='#L16'>16</a>
|
|
82
|
+
<a name='L17'></a><a href='#L17'>17</a>
|
|
83
|
+
<a name='L18'></a><a href='#L18'>18</a>
|
|
84
|
+
<a name='L19'></a><a href='#L19'>19</a>
|
|
85
|
+
<a name='L20'></a><a href='#L20'>20</a>
|
|
86
|
+
<a name='L21'></a><a href='#L21'>21</a>
|
|
87
|
+
<a name='L22'></a><a href='#L22'>22</a>
|
|
88
|
+
<a name='L23'></a><a href='#L23'>23</a>
|
|
89
|
+
<a name='L24'></a><a href='#L24'>24</a>
|
|
90
|
+
<a name='L25'></a><a href='#L25'>25</a>
|
|
91
|
+
<a name='L26'></a><a href='#L26'>26</a>
|
|
92
|
+
<a name='L27'></a><a href='#L27'>27</a>
|
|
93
|
+
<a name='L28'></a><a href='#L28'>28</a>
|
|
94
|
+
<a name='L29'></a><a href='#L29'>29</a>
|
|
95
|
+
<a name='L30'></a><a href='#L30'>30</a>
|
|
96
|
+
<a name='L31'></a><a href='#L31'>31</a>
|
|
97
|
+
<a name='L32'></a><a href='#L32'>32</a>
|
|
98
|
+
<a name='L33'></a><a href='#L33'>33</a>
|
|
99
|
+
<a name='L34'></a><a href='#L34'>34</a>
|
|
100
|
+
<a name='L35'></a><a href='#L35'>35</a>
|
|
101
|
+
<a name='L36'></a><a href='#L36'>36</a>
|
|
102
|
+
<a name='L37'></a><a href='#L37'>37</a>
|
|
103
|
+
<a name='L38'></a><a href='#L38'>38</a>
|
|
104
|
+
<a name='L39'></a><a href='#L39'>39</a>
|
|
105
|
+
<a name='L40'></a><a href='#L40'>40</a>
|
|
106
|
+
<a name='L41'></a><a href='#L41'>41</a>
|
|
107
|
+
<a name='L42'></a><a href='#L42'>42</a>
|
|
108
|
+
<a name='L43'></a><a href='#L43'>43</a>
|
|
109
|
+
<a name='L44'></a><a href='#L44'>44</a>
|
|
110
|
+
<a name='L45'></a><a href='#L45'>45</a>
|
|
111
|
+
<a name='L46'></a><a href='#L46'>46</a>
|
|
112
|
+
<a name='L47'></a><a href='#L47'>47</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
113
|
+
<span class="cline-any cline-neutral"> </span>
|
|
114
|
+
<span class="cline-any cline-neutral"> </span>
|
|
115
|
+
<span class="cline-any cline-neutral"> </span>
|
|
116
|
+
<span class="cline-any cline-neutral"> </span>
|
|
117
|
+
<span class="cline-any cline-neutral"> </span>
|
|
118
|
+
<span class="cline-any cline-neutral"> </span>
|
|
119
|
+
<span class="cline-any cline-neutral"> </span>
|
|
120
|
+
<span class="cline-any cline-neutral"> </span>
|
|
121
|
+
<span class="cline-any cline-neutral"> </span>
|
|
122
|
+
<span class="cline-any cline-neutral"> </span>
|
|
123
|
+
<span class="cline-any cline-neutral"> </span>
|
|
124
|
+
<span class="cline-any cline-yes">6x</span>
|
|
125
|
+
<span class="cline-any cline-neutral"> </span>
|
|
126
|
+
<span class="cline-any cline-neutral"> </span>
|
|
127
|
+
<span class="cline-any cline-neutral"> </span>
|
|
128
|
+
<span class="cline-any cline-neutral"> </span>
|
|
129
|
+
<span class="cline-any cline-neutral"> </span>
|
|
130
|
+
<span class="cline-any cline-neutral"> </span>
|
|
131
|
+
<span class="cline-any cline-yes">1x</span>
|
|
132
|
+
<span class="cline-any cline-neutral"> </span>
|
|
133
|
+
<span class="cline-any cline-yes">3x</span>
|
|
134
|
+
<span class="cline-any cline-yes">3x</span>
|
|
135
|
+
<span class="cline-any cline-yes">3x</span>
|
|
136
|
+
<span class="cline-any cline-yes">3x</span>
|
|
137
|
+
<span class="cline-any cline-neutral"> </span>
|
|
138
|
+
<span class="cline-any cline-yes">3x</span>
|
|
139
|
+
<span class="cline-any cline-yes">1x</span>
|
|
140
|
+
<span class="cline-any cline-yes">1x</span>
|
|
141
|
+
<span class="cline-any cline-neutral"> </span>
|
|
142
|
+
<span class="cline-any cline-neutral"> </span>
|
|
143
|
+
<span class="cline-any cline-yes">3x</span>
|
|
144
|
+
<span class="cline-any cline-yes">1x</span>
|
|
145
|
+
<span class="cline-any cline-neutral"> </span>
|
|
146
|
+
<span class="cline-any cline-neutral"> </span>
|
|
147
|
+
<span class="cline-any cline-yes">3x</span>
|
|
148
|
+
<span class="cline-any cline-neutral"> </span>
|
|
149
|
+
<span class="cline-any cline-neutral"> </span>
|
|
150
|
+
<span class="cline-any cline-yes">1x</span>
|
|
151
|
+
<span class="cline-any cline-neutral"> </span>
|
|
152
|
+
<span class="cline-any cline-yes">1x</span>
|
|
153
|
+
<span class="cline-any cline-yes">1x</span>
|
|
154
|
+
<span class="cline-any cline-yes">1x</span>
|
|
155
|
+
<span class="cline-any cline-neutral"> </span>
|
|
156
|
+
<span class="cline-any cline-yes">1x</span>
|
|
157
|
+
<span class="cline-any cline-neutral"> </span>
|
|
158
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">/**
|
|
159
|
+
* Copyright (c) 2019-Present, Nitrogen Labs, Inc.
|
|
160
|
+
* Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
|
|
161
|
+
*/
|
|
162
|
+
// const eventCategory: string = 'notifications';
|
|
163
|
+
// Push Notifications
|
|
164
|
+
import {Notification as APNNotification, Provider, Responses} from 'apn';
|
|
165
|
+
|
|
166
|
+
import {Config} from '../config.js';
|
|
167
|
+
|
|
168
|
+
import type {NotificationType} from '../types/notifications.types.js';
|
|
169
|
+
|
|
170
|
+
export const getApnProvider = () => new Provider({
|
|
171
|
+
ca: Config.get('app.apn.ca'),
|
|
172
|
+
cert: Config.get('app.apn.cert'),
|
|
173
|
+
key: Config.get('app.apn.key'),
|
|
174
|
+
production: Config.get('environment') === 'prod'
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
export const pushNotification = (deviceTokens: string[], note: NotificationType): Promise<Responses> => {
|
|
178
|
+
// Push notification to device
|
|
179
|
+
const provider: Provider = getApnProvider();
|
|
180
|
+
const notification: APNNotification = new APNNotification();
|
|
181
|
+
notification.topic = Config.get('app.apn.id');
|
|
182
|
+
notification.alert = note.message;
|
|
183
|
+
|
|
184
|
+
if(note.data) {
|
|
185
|
+
notification.mutableContent = true;
|
|
186
|
+
notification.payload = note.data;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
if(note.badge !== undefined) {
|
|
190
|
+
notification.badge = note.badge;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
return provider.send(notification, deviceTokens);
|
|
194
|
+
};
|
|
195
|
+
|
|
196
|
+
export const clearBadges = (deviceTokens: string[]): Promise<Responses> => {
|
|
197
|
+
// Push notification to device
|
|
198
|
+
const provider = getApnProvider();
|
|
199
|
+
const notification = new APNNotification();
|
|
200
|
+
notification.badge = 0;
|
|
201
|
+
|
|
202
|
+
return provider.send(notification, deviceTokens);
|
|
203
|
+
};
|
|
204
|
+
</pre></td></tr></table></pre>
|
|
205
|
+
|
|
206
|
+
<div class='push'></div><!-- for sticky footer -->
|
|
207
|
+
</div><!-- /wrapper -->
|
|
208
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
|
209
|
+
Code coverage generated by
|
|
210
|
+
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
211
|
+
at 2025-08-09T00:45:28.923Z
|
|
212
|
+
</div>
|
|
213
|
+
<script src="../prettify.js"></script>
|
|
214
|
+
<script>
|
|
215
|
+
window.onload = function () {
|
|
216
|
+
prettyPrint();
|
|
217
|
+
};
|
|
218
|
+
</script>
|
|
219
|
+
<script src="../sorter.js"></script>
|
|
220
|
+
<script src="../block-navigation.js"></script>
|
|
221
|
+
</body>
|
|
222
|
+
</html>
|
|
223
|
+
|