@blackcode_sa/metaestetics-api 1.13.3 → 1.13.5
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/dist/admin/index.d.mts +15 -28
- package/dist/admin/index.d.ts +15 -28
- package/dist/index.d.mts +18 -30
- package/dist/index.d.ts +18 -30
- package/dist/index.js +11 -3
- package/dist/index.mjs +11 -3
- package/package.json +121 -119
- package/src/__mocks__/firstore.ts +10 -10
- package/src/admin/aggregation/README.md +79 -79
- package/src/admin/aggregation/appointment/README.md +128 -128
- package/src/admin/aggregation/appointment/appointment.aggregation.service.ts +1984 -1984
- package/src/admin/aggregation/appointment/index.ts +1 -1
- package/src/admin/aggregation/clinic/README.md +52 -52
- package/src/admin/aggregation/clinic/clinic.aggregation.service.ts +703 -703
- package/src/admin/aggregation/clinic/index.ts +1 -1
- package/src/admin/aggregation/forms/README.md +13 -13
- package/src/admin/aggregation/forms/filled-forms.aggregation.service.ts +322 -322
- package/src/admin/aggregation/forms/index.ts +1 -1
- package/src/admin/aggregation/index.ts +8 -8
- package/src/admin/aggregation/patient/README.md +27 -27
- package/src/admin/aggregation/patient/index.ts +1 -1
- package/src/admin/aggregation/patient/patient.aggregation.service.ts +141 -141
- package/src/admin/aggregation/practitioner/README.md +42 -42
- package/src/admin/aggregation/practitioner/index.ts +1 -1
- package/src/admin/aggregation/practitioner/practitioner.aggregation.service.ts +433 -433
- package/src/admin/aggregation/practitioner-invite/index.ts +1 -1
- package/src/admin/aggregation/practitioner-invite/practitioner-invite.aggregation.service.ts +961 -961
- package/src/admin/aggregation/procedure/README.md +43 -43
- package/src/admin/aggregation/procedure/index.ts +1 -1
- package/src/admin/aggregation/procedure/procedure.aggregation.service.ts +702 -702
- package/src/admin/aggregation/reviews/index.ts +1 -1
- package/src/admin/aggregation/reviews/reviews.aggregation.service.ts +689 -689
- package/src/admin/analytics/analytics.admin.service.ts +278 -278
- package/src/admin/analytics/index.ts +2 -2
- package/src/admin/booking/README.md +125 -125
- package/src/admin/booking/booking.admin.ts +1037 -1037
- package/src/admin/booking/booking.calculator.ts +712 -712
- package/src/admin/booking/booking.types.ts +59 -59
- package/src/admin/booking/index.ts +3 -3
- package/src/admin/booking/timezones-problem.md +185 -185
- package/src/admin/calendar/README.md +7 -7
- package/src/admin/calendar/calendar.admin.service.ts +345 -345
- package/src/admin/calendar/index.ts +1 -1
- package/src/admin/documentation-templates/document-manager.admin.ts +260 -260
- package/src/admin/documentation-templates/index.ts +1 -1
- package/src/admin/free-consultation/free-consultation-utils.admin.ts +148 -148
- package/src/admin/free-consultation/index.ts +1 -1
- package/src/admin/index.ts +81 -81
- package/src/admin/logger/index.ts +78 -78
- package/src/admin/mailing/README.md +95 -95
- package/src/admin/mailing/appointment/appointment.mailing.service.ts +732 -732
- package/src/admin/mailing/appointment/index.ts +1 -1
- package/src/admin/mailing/appointment/templates/patient/appointment-confirmed.html +40 -40
- package/src/admin/mailing/base.mailing.service.ts +208 -208
- package/src/admin/mailing/index.ts +3 -3
- package/src/admin/mailing/practitionerInvite/existing-practitioner-invite.mailing.ts +611 -611
- package/src/admin/mailing/practitionerInvite/index.ts +2 -2
- package/src/admin/mailing/practitionerInvite/practitionerInvite.mailing.ts +395 -395
- package/src/admin/mailing/practitionerInvite/templates/existing-practitioner-invitation.template.ts +155 -155
- package/src/admin/mailing/practitionerInvite/templates/invitation.template.ts +101 -101
- package/src/admin/mailing/practitionerInvite/templates/invite-accepted-notification.template.ts +228 -228
- package/src/admin/mailing/practitionerInvite/templates/invite-rejected-notification.template.ts +242 -242
- package/src/admin/notifications/index.ts +1 -1
- package/src/admin/notifications/notifications.admin.ts +710 -710
- package/src/admin/requirements/README.md +128 -128
- package/src/admin/requirements/index.ts +1 -1
- package/src/admin/requirements/patient-requirements.admin.service.ts +475 -475
- package/src/admin/users/index.ts +1 -1
- package/src/admin/users/user-profile.admin.ts +405 -405
- package/src/backoffice/constants/certification.constants.ts +13 -13
- package/src/backoffice/constants/index.ts +1 -1
- package/src/backoffice/errors/backoffice.errors.ts +181 -181
- package/src/backoffice/errors/index.ts +1 -1
- package/src/backoffice/expo-safe/README.md +26 -26
- package/src/backoffice/expo-safe/index.ts +41 -41
- package/src/backoffice/index.ts +5 -5
- package/src/backoffice/services/FIXES_README.md +102 -102
- package/src/backoffice/services/README.md +57 -57
- package/src/backoffice/services/analytics.service.proposal.md +863 -863
- package/src/backoffice/services/analytics.service.summary.md +143 -143
- package/src/backoffice/services/brand.service.ts +256 -256
- package/src/backoffice/services/category.service.ts +384 -384
- package/src/backoffice/services/constants.service.ts +385 -385
- package/src/backoffice/services/documentation-template.service.ts +202 -202
- package/src/backoffice/services/index.ts +10 -10
- package/src/backoffice/services/migrate-products.ts +116 -116
- package/src/backoffice/services/product.service.ts +553 -553
- package/src/backoffice/services/requirement.service.ts +235 -235
- package/src/backoffice/services/subcategory.service.ts +461 -461
- package/src/backoffice/services/technology.service.ts +1151 -1151
- package/src/backoffice/types/README.md +12 -12
- package/src/backoffice/types/admin-constants.types.ts +69 -69
- package/src/backoffice/types/brand.types.ts +29 -29
- package/src/backoffice/types/category.types.ts +67 -67
- package/src/backoffice/types/documentation-templates.types.ts +28 -28
- package/src/backoffice/types/index.ts +10 -10
- package/src/backoffice/types/procedure-product.types.ts +38 -38
- package/src/backoffice/types/product.types.ts +240 -240
- package/src/backoffice/types/requirement.types.ts +63 -63
- package/src/backoffice/types/static/README.md +18 -18
- package/src/backoffice/types/static/blocking-condition.types.ts +21 -21
- package/src/backoffice/types/static/certification.types.ts +37 -37
- package/src/backoffice/types/static/contraindication.types.ts +19 -19
- package/src/backoffice/types/static/index.ts +6 -6
- package/src/backoffice/types/static/pricing.types.ts +16 -16
- package/src/backoffice/types/static/procedure-family.types.ts +14 -14
- package/src/backoffice/types/static/treatment-benefit.types.ts +22 -22
- package/src/backoffice/types/subcategory.types.ts +34 -34
- package/src/backoffice/types/technology.types.ts +168 -168
- package/src/backoffice/validations/index.ts +1 -1
- package/src/backoffice/validations/schemas.ts +164 -164
- package/src/config/__mocks__/firebase.ts +99 -99
- package/src/config/firebase.ts +78 -78
- package/src/config/index.ts +9 -9
- package/src/errors/auth.error.ts +6 -6
- package/src/errors/auth.errors.ts +200 -200
- package/src/errors/clinic.errors.ts +32 -32
- package/src/errors/firebase.errors.ts +47 -47
- package/src/errors/user.errors.ts +99 -99
- package/src/index.backup.ts +407 -407
- package/src/index.ts +6 -6
- package/src/locales/en.ts +31 -31
- package/src/recommender/admin/index.ts +1 -1
- package/src/recommender/admin/services/recommender.service.admin.ts +5 -5
- package/src/recommender/front/index.ts +1 -1
- package/src/recommender/front/services/onboarding.service.ts +5 -5
- package/src/recommender/front/services/recommender.service.ts +3 -3
- package/src/recommender/index.ts +1 -1
- package/src/services/PATIENTAUTH.MD +197 -197
- package/src/services/README.md +106 -106
- package/src/services/__tests__/auth/auth.mock.test.ts +17 -17
- package/src/services/__tests__/auth/auth.setup.ts +293 -293
- package/src/services/__tests__/auth.service.test.ts +346 -346
- package/src/services/__tests__/base.service.test.ts +77 -77
- package/src/services/__tests__/user.service.test.ts +528 -528
- package/src/services/analytics/ARCHITECTURE.md +199 -199
- package/src/services/analytics/CLOUD_FUNCTIONS.md +225 -225
- package/src/services/analytics/GROUPED_ANALYTICS.md +501 -501
- package/src/services/analytics/QUICK_START.md +393 -393
- package/src/services/analytics/README.md +304 -304
- package/src/services/analytics/SUMMARY.md +141 -141
- package/src/services/analytics/TRENDS.md +380 -380
- package/src/services/analytics/USAGE_GUIDE.md +518 -518
- package/src/services/analytics/analytics-cloud.service.ts +222 -222
- package/src/services/analytics/analytics.service.ts +2142 -2142
- package/src/services/analytics/index.ts +4 -4
- package/src/services/analytics/review-analytics.service.ts +941 -941
- package/src/services/analytics/utils/appointment-filtering.utils.ts +138 -138
- package/src/services/analytics/utils/cost-calculation.utils.ts +182 -182
- package/src/services/analytics/utils/grouping.utils.ts +434 -434
- package/src/services/analytics/utils/stored-analytics.utils.ts +347 -347
- package/src/services/analytics/utils/time-calculation.utils.ts +186 -186
- package/src/services/analytics/utils/trend-calculation.utils.ts +200 -200
- package/src/services/appointment/README.md +17 -17
- package/src/services/appointment/appointment.service.ts +2558 -2558
- package/src/services/appointment/index.ts +1 -1
- package/src/services/appointment/utils/appointment.utils.ts +552 -552
- package/src/services/appointment/utils/extended-procedure.utils.ts +314 -314
- package/src/services/appointment/utils/form-initialization.utils.ts +225 -225
- package/src/services/appointment/utils/recommended-procedure.utils.ts +195 -195
- package/src/services/appointment/utils/zone-management.utils.ts +353 -353
- package/src/services/appointment/utils/zone-photo.utils.ts +152 -152
- package/src/services/auth/auth.service.ts +989 -989
- package/src/services/auth/auth.v2.service.ts +961 -961
- package/src/services/auth/index.ts +7 -7
- package/src/services/auth/utils/error.utils.ts +90 -90
- package/src/services/auth/utils/firebase.utils.ts +49 -49
- package/src/services/auth/utils/index.ts +21 -21
- package/src/services/auth/utils/practitioner.utils.ts +125 -125
- package/src/services/base.service.ts +41 -41
- package/src/services/calendar/calendar.service.ts +1077 -1077
- package/src/services/calendar/calendar.v2.service.ts +1683 -1683
- package/src/services/calendar/calendar.v3.service.ts +313 -313
- package/src/services/calendar/externalCalendar.service.ts +178 -178
- package/src/services/calendar/index.ts +5 -5
- package/src/services/calendar/synced-calendars.service.ts +743 -743
- package/src/services/calendar/utils/appointment.utils.ts +265 -265
- package/src/services/calendar/utils/calendar-event.utils.ts +646 -646
- package/src/services/calendar/utils/clinic.utils.ts +237 -237
- package/src/services/calendar/utils/docs.utils.ts +157 -157
- package/src/services/calendar/utils/google-calendar.utils.ts +697 -697
- package/src/services/calendar/utils/index.ts +8 -8
- package/src/services/calendar/utils/patient.utils.ts +198 -198
- package/src/services/calendar/utils/practitioner.utils.ts +221 -221
- package/src/services/calendar/utils/synced-calendar.utils.ts +472 -472
- package/src/services/clinic/README.md +204 -204
- package/src/services/clinic/__tests__/clinic-admin.service.test.ts +287 -287
- package/src/services/clinic/__tests__/clinic-group.service.test.ts +352 -352
- package/src/services/clinic/__tests__/clinic.service.test.ts +354 -354
- package/src/services/clinic/billing-transactions.service.ts +217 -217
- package/src/services/clinic/clinic-admin.service.ts +202 -202
- package/src/services/clinic/clinic-group.service.ts +310 -310
- package/src/services/clinic/clinic.service.ts +708 -708
- package/src/services/clinic/index.ts +5 -5
- package/src/services/clinic/practitioner-invite.service.ts +519 -519
- package/src/services/clinic/utils/admin.utils.ts +551 -551
- package/src/services/clinic/utils/clinic-group.utils.ts +646 -646
- package/src/services/clinic/utils/clinic.utils.ts +949 -949
- package/src/services/clinic/utils/filter.utils.d.ts +23 -23
- package/src/services/clinic/utils/filter.utils.ts +446 -446
- package/src/services/clinic/utils/index.ts +11 -11
- package/src/services/clinic/utils/photos.utils.ts +188 -188
- package/src/services/clinic/utils/search.utils.ts +84 -84
- package/src/services/clinic/utils/tag.utils.ts +124 -124
- package/src/services/documentation-templates/documentation-template.service.ts +537 -537
- package/src/services/documentation-templates/filled-document.service.ts +587 -587
- package/src/services/documentation-templates/index.ts +2 -2
- package/src/services/index.ts +14 -14
- package/src/services/media/index.ts +1 -1
- package/src/services/media/media.service.ts +418 -418
- package/src/services/notifications/__tests__/notification.service.test.ts +242 -242
- package/src/services/notifications/index.ts +1 -1
- package/src/services/notifications/notification.service.ts +215 -215
- package/src/services/patient/README.md +48 -48
- package/src/services/patient/To-Do.md +43 -43
- package/src/services/patient/__tests__/patient.service.test.ts +294 -294
- package/src/services/patient/index.ts +2 -2
- package/src/services/patient/patient.service.ts +883 -883
- package/src/services/patient/patientRequirements.service.ts +285 -285
- package/src/services/patient/utils/aesthetic-analysis.utils.ts +176 -176
- package/src/services/patient/utils/clinic.utils.ts +80 -80
- package/src/services/patient/utils/docs.utils.ts +142 -142
- package/src/services/patient/utils/index.ts +9 -9
- package/src/services/patient/utils/location.utils.ts +126 -126
- package/src/services/patient/utils/medical-stuff.utils.ts +143 -143
- package/src/services/patient/utils/medical.utils.ts +458 -458
- package/src/services/patient/utils/practitioner.utils.ts +260 -260
- package/src/services/patient/utils/profile.utils.ts +510 -510
- package/src/services/patient/utils/sensitive.utils.ts +260 -260
- package/src/services/patient/utils/token.utils.ts +211 -211
- package/src/services/practitioner/README.md +145 -145
- package/src/services/practitioner/index.ts +1 -1
- package/src/services/practitioner/practitioner.service.ts +1742 -1742
- package/src/services/procedure/README.md +163 -163
- package/src/services/procedure/index.ts +1 -1
- package/src/services/procedure/procedure.service.ts +2200 -2191
- package/src/services/reviews/index.ts +1 -1
- package/src/services/reviews/reviews.service.ts +734 -734
- package/src/services/user/index.ts +1 -1
- package/src/services/user/user.service.ts +489 -489
- package/src/services/user/user.v2.service.ts +466 -466
- package/src/types/analytics/analytics.types.ts +597 -597
- package/src/types/analytics/grouped-analytics.types.ts +173 -173
- package/src/types/analytics/index.ts +4 -4
- package/src/types/analytics/stored-analytics.types.ts +137 -137
- package/src/types/appointment/index.ts +480 -480
- package/src/types/calendar/index.ts +258 -258
- package/src/types/calendar/synced-calendar.types.ts +66 -66
- package/src/types/clinic/index.ts +498 -489
- package/src/types/clinic/practitioner-invite.types.ts +91 -91
- package/src/types/clinic/preferences.types.ts +159 -159
- package/src/types/clinic/to-do +3 -3
- package/src/types/documentation-templates/index.ts +308 -308
- package/src/types/index.ts +47 -47
- package/src/types/notifications/README.md +77 -77
- package/src/types/notifications/index.ts +286 -286
- package/src/types/patient/aesthetic-analysis.types.ts +66 -66
- package/src/types/patient/allergies.ts +58 -58
- package/src/types/patient/index.ts +275 -275
- package/src/types/patient/medical-info.types.ts +152 -152
- package/src/types/patient/patient-requirements.ts +92 -92
- package/src/types/patient/token.types.ts +61 -61
- package/src/types/practitioner/index.ts +206 -206
- package/src/types/procedure/index.ts +181 -181
- package/src/types/profile/index.ts +39 -39
- package/src/types/reviews/index.ts +132 -132
- package/src/types/tz-lookup.d.ts +4 -4
- package/src/types/user/index.ts +38 -38
- package/src/utils/TIMESTAMPS.md +176 -176
- package/src/utils/TimestampUtils.ts +241 -241
- package/src/utils/index.ts +1 -1
- package/src/validations/appointment.schema.ts +574 -574
- package/src/validations/calendar.schema.ts +225 -225
- package/src/validations/clinic.schema.ts +494 -493
- package/src/validations/common.schema.ts +25 -25
- package/src/validations/documentation-templates/index.ts +1 -1
- package/src/validations/documentation-templates/template.schema.ts +220 -220
- package/src/validations/documentation-templates.schema.ts +10 -10
- package/src/validations/index.ts +20 -20
- package/src/validations/media.schema.ts +10 -10
- package/src/validations/notification.schema.ts +90 -90
- package/src/validations/patient/aesthetic-analysis.schema.ts +55 -55
- package/src/validations/patient/medical-info.schema.ts +125 -125
- package/src/validations/patient/patient-requirements.schema.ts +84 -84
- package/src/validations/patient/token.schema.ts +29 -29
- package/src/validations/patient.schema.ts +217 -217
- package/src/validations/practitioner.schema.ts +222 -222
- package/src/validations/procedure-product.schema.ts +41 -41
- package/src/validations/procedure.schema.ts +124 -124
- package/src/validations/profile-info.schema.ts +41 -41
- package/src/validations/reviews.schema.ts +195 -195
- package/src/validations/schemas.ts +104 -104
- package/src/validations/shared.schema.ts +78 -78
|
@@ -1,346 +1,346 @@
|
|
|
1
|
-
// Mock Firebase Auth
|
|
2
|
-
const mockFirebaseUser = {
|
|
3
|
-
uid: "test-uid",
|
|
4
|
-
email: "test@example.com",
|
|
5
|
-
isAnonymous: false,
|
|
6
|
-
emailVerified: false,
|
|
7
|
-
metadata: {},
|
|
8
|
-
providerData: [],
|
|
9
|
-
refreshToken: "test-refresh-token",
|
|
10
|
-
tenantId: null,
|
|
11
|
-
delete: jest.fn(),
|
|
12
|
-
getIdToken: jest.fn(),
|
|
13
|
-
getIdTokenResult: jest.fn(),
|
|
14
|
-
reload: jest.fn(),
|
|
15
|
-
toJSON: jest.fn(),
|
|
16
|
-
displayName: null,
|
|
17
|
-
phoneNumber: null,
|
|
18
|
-
photoURL: null,
|
|
19
|
-
providerId: "firebase",
|
|
20
|
-
} as unknown as FirebaseUser;
|
|
21
|
-
|
|
22
|
-
const mockAnonymousUser = {
|
|
23
|
-
...mockFirebaseUser,
|
|
24
|
-
uid: "test-uid",
|
|
25
|
-
email: null,
|
|
26
|
-
isAnonymous: true,
|
|
27
|
-
} as unknown as FirebaseUser;
|
|
28
|
-
|
|
29
|
-
const mockAuth = {
|
|
30
|
-
currentUser: mockFirebaseUser as FirebaseUser | null,
|
|
31
|
-
signInWithEmailAndPassword: jest
|
|
32
|
-
.fn()
|
|
33
|
-
.mockImplementation((auth, email, password) => {
|
|
34
|
-
if (email === "invalid-email") {
|
|
35
|
-
throw new Error("Invalid email format");
|
|
36
|
-
}
|
|
37
|
-
if (password.length < 8) {
|
|
38
|
-
throw new Error("Password must be at least 8 characters");
|
|
39
|
-
}
|
|
40
|
-
return Promise.resolve({ user: mockFirebaseUser });
|
|
41
|
-
}),
|
|
42
|
-
createUserWithEmailAndPassword: jest
|
|
43
|
-
.fn()
|
|
44
|
-
.mockImplementation((auth, email, password) => {
|
|
45
|
-
if (email === "invalid-email") {
|
|
46
|
-
throw new Error("Invalid email format");
|
|
47
|
-
}
|
|
48
|
-
if (password.length < 8) {
|
|
49
|
-
throw new Error("Password must be at least 8 characters");
|
|
50
|
-
}
|
|
51
|
-
return Promise.resolve({ user: mockFirebaseUser });
|
|
52
|
-
}),
|
|
53
|
-
signInAnonymously: jest.fn().mockResolvedValue({ user: mockAnonymousUser }),
|
|
54
|
-
signOut: jest.fn().mockResolvedValue(undefined),
|
|
55
|
-
signInWithPopup: jest.fn().mockImplementation((auth, provider) => {
|
|
56
|
-
if (provider.providerId === "facebook.com") {
|
|
57
|
-
return Promise.resolve({ user: mockFacebookUser });
|
|
58
|
-
}
|
|
59
|
-
if (provider.providerId === "apple.com") {
|
|
60
|
-
return Promise.resolve({ user: mockAppleUser });
|
|
61
|
-
}
|
|
62
|
-
return Promise.resolve({ user: mockFirebaseUser });
|
|
63
|
-
}),
|
|
64
|
-
onAuthStateChanged: jest.fn(),
|
|
65
|
-
};
|
|
66
|
-
|
|
67
|
-
// Hoisting mocks
|
|
68
|
-
jest.mock("firebase/auth", () => ({
|
|
69
|
-
getAuth: jest.fn().mockReturnValue(mockAuth),
|
|
70
|
-
GoogleAuthProvider: jest.fn().mockImplementation(() => ({})),
|
|
71
|
-
FacebookAuthProvider: jest.fn().mockImplementation(() => ({})),
|
|
72
|
-
OAuthProvider: jest.fn().mockImplementation(() => ({})),
|
|
73
|
-
signInWithEmailAndPassword: jest
|
|
74
|
-
.fn()
|
|
75
|
-
.mockImplementation((auth, email, password) => {
|
|
76
|
-
if (email === "invalid-email") {
|
|
77
|
-
throw new Error("Invalid email format");
|
|
78
|
-
}
|
|
79
|
-
if (password.length < 8) {
|
|
80
|
-
throw new Error("Password must be at least 8 characters");
|
|
81
|
-
}
|
|
82
|
-
return Promise.resolve({ user: mockFirebaseUser });
|
|
83
|
-
}),
|
|
84
|
-
createUserWithEmailAndPassword: jest
|
|
85
|
-
.fn()
|
|
86
|
-
.mockImplementation((auth, email, password) => {
|
|
87
|
-
if (email === "invalid-email") {
|
|
88
|
-
throw new Error("Invalid email format");
|
|
89
|
-
}
|
|
90
|
-
if (password.length < 8) {
|
|
91
|
-
throw new Error("Password must be at least 8 characters");
|
|
92
|
-
}
|
|
93
|
-
return Promise.resolve({ user: mockFirebaseUser });
|
|
94
|
-
}),
|
|
95
|
-
signInAnonymously: jest.fn().mockResolvedValue({ user: mockAnonymousUser }),
|
|
96
|
-
signOut: jest.fn().mockResolvedValue(undefined),
|
|
97
|
-
signInWithPopup: jest.fn().mockImplementation((auth, provider) => {
|
|
98
|
-
if (provider.providerId === "facebook.com") {
|
|
99
|
-
return Promise.resolve({ user: mockFacebookUser });
|
|
100
|
-
}
|
|
101
|
-
if (provider.providerId === "apple.com") {
|
|
102
|
-
return Promise.resolve({ user: mockAppleUser });
|
|
103
|
-
}
|
|
104
|
-
return Promise.resolve({ user: mockFirebaseUser });
|
|
105
|
-
}),
|
|
106
|
-
onAuthStateChanged: jest.fn(),
|
|
107
|
-
}));
|
|
108
|
-
|
|
109
|
-
jest.mock("../../config/firebase", () => ({
|
|
110
|
-
initializeFirebase: jest.fn().mockResolvedValue({
|
|
111
|
-
app: {},
|
|
112
|
-
auth: mockAuth,
|
|
113
|
-
db: {},
|
|
114
|
-
analytics: null,
|
|
115
|
-
}),
|
|
116
|
-
getFirebaseInstance: jest.fn().mockResolvedValue({
|
|
117
|
-
db: {},
|
|
118
|
-
auth: mockAuth,
|
|
119
|
-
}),
|
|
120
|
-
}));
|
|
121
|
-
|
|
122
|
-
import { AuthService } from "../auth/auth.service";
|
|
123
|
-
import { User as FirebaseUser } from "firebase/auth";
|
|
124
|
-
import { UserRole } from "../../types";
|
|
125
|
-
|
|
126
|
-
const mockFacebookUser = {
|
|
127
|
-
...mockFirebaseUser,
|
|
128
|
-
uid: "facebook-uid",
|
|
129
|
-
email: "facebook@example.com",
|
|
130
|
-
} as unknown as FirebaseUser;
|
|
131
|
-
|
|
132
|
-
const mockAppleUser = {
|
|
133
|
-
...mockFirebaseUser,
|
|
134
|
-
uid: "apple-uid",
|
|
135
|
-
email: "apple@example.com",
|
|
136
|
-
} as unknown as FirebaseUser;
|
|
137
|
-
|
|
138
|
-
// Setup mocks
|
|
139
|
-
beforeAll(() => {
|
|
140
|
-
const { initializeFirebase } = require("../../config/firebase");
|
|
141
|
-
(initializeFirebase as jest.Mock).mockResolvedValue({
|
|
142
|
-
app: {},
|
|
143
|
-
auth: mockAuth,
|
|
144
|
-
db: {},
|
|
145
|
-
analytics: null,
|
|
146
|
-
});
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
describe("AuthService", () => {
|
|
150
|
-
let service: AuthService;
|
|
151
|
-
|
|
152
|
-
beforeEach(async () => {
|
|
153
|
-
service = new AuthService();
|
|
154
|
-
await service["initialized"]; // Čekamo da se inicijalizacija završi
|
|
155
|
-
});
|
|
156
|
-
|
|
157
|
-
afterEach(() => {
|
|
158
|
-
jest.clearAllMocks();
|
|
159
|
-
});
|
|
160
|
-
|
|
161
|
-
describe("signUp", () => {
|
|
162
|
-
it("should create a new user account with email and password", async () => {
|
|
163
|
-
const email = "test@example.com";
|
|
164
|
-
const password = "Password123!";
|
|
165
|
-
const expectedUser = {
|
|
166
|
-
uid: "test-uid",
|
|
167
|
-
email: "test@example.com",
|
|
168
|
-
roles: [UserRole.PATIENT],
|
|
169
|
-
isAnonymous: false,
|
|
170
|
-
createdAt: expect.any(Date),
|
|
171
|
-
updatedAt: expect.any(Date),
|
|
172
|
-
lastLoginAt: expect.any(Date),
|
|
173
|
-
patientProfile: {
|
|
174
|
-
firstName: "Test",
|
|
175
|
-
lastName: "User",
|
|
176
|
-
},
|
|
177
|
-
practitionerProfile: null,
|
|
178
|
-
adminProfile: null,
|
|
179
|
-
};
|
|
180
|
-
|
|
181
|
-
const result = await service.signUp(email, password, UserRole.PATIENT);
|
|
182
|
-
|
|
183
|
-
expect(result).toEqual(expectedUser);
|
|
184
|
-
});
|
|
185
|
-
|
|
186
|
-
it("should throw an error if email is invalid", async () => {
|
|
187
|
-
const email = "invalid-email";
|
|
188
|
-
const password = "Password123!";
|
|
189
|
-
|
|
190
|
-
await expect(
|
|
191
|
-
service.signUp(email, password, UserRole.PATIENT)
|
|
192
|
-
).rejects.toThrow("Invalid email format");
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
it("should throw an error if password is invalid", async () => {
|
|
196
|
-
const email = "test@example.com";
|
|
197
|
-
const password = "123"; // Prekratka lozinka
|
|
198
|
-
|
|
199
|
-
await expect(
|
|
200
|
-
service.signUp(email, password, UserRole.PATIENT)
|
|
201
|
-
).rejects.toThrow("Password must be at least 8 characters");
|
|
202
|
-
});
|
|
203
|
-
});
|
|
204
|
-
|
|
205
|
-
describe("signIn", () => {
|
|
206
|
-
it("should sign in user with email and password", async () => {
|
|
207
|
-
const email = "test@example.com";
|
|
208
|
-
const password = "Password123!";
|
|
209
|
-
const expectedUser = {
|
|
210
|
-
uid: "test-uid",
|
|
211
|
-
email: "test@example.com",
|
|
212
|
-
roles: [UserRole.PATIENT],
|
|
213
|
-
isAnonymous: false,
|
|
214
|
-
createdAt: expect.any(Date),
|
|
215
|
-
updatedAt: expect.any(Date),
|
|
216
|
-
lastLoginAt: expect.any(Date),
|
|
217
|
-
patientProfile: null,
|
|
218
|
-
practitionerProfile: null,
|
|
219
|
-
adminProfile: null,
|
|
220
|
-
};
|
|
221
|
-
|
|
222
|
-
const result = await service.signIn(email, password);
|
|
223
|
-
|
|
224
|
-
expect(result).toEqual(expectedUser);
|
|
225
|
-
});
|
|
226
|
-
|
|
227
|
-
it("should throw an error if email is invalid", async () => {
|
|
228
|
-
const email = "invalid-email";
|
|
229
|
-
const password = "Password123!";
|
|
230
|
-
|
|
231
|
-
await expect(service.signIn(email, password)).rejects.toThrow(
|
|
232
|
-
"Invalid email format"
|
|
233
|
-
);
|
|
234
|
-
});
|
|
235
|
-
|
|
236
|
-
it("should throw an error if password is invalid", async () => {
|
|
237
|
-
const email = "test@example.com";
|
|
238
|
-
const password = "123";
|
|
239
|
-
|
|
240
|
-
await expect(service.signIn(email, password)).rejects.toThrow(
|
|
241
|
-
"Password must be at least 8 characters"
|
|
242
|
-
);
|
|
243
|
-
});
|
|
244
|
-
});
|
|
245
|
-
|
|
246
|
-
describe("signInWithFacebook", () => {
|
|
247
|
-
it("should sign in user with Facebook", async () => {
|
|
248
|
-
const expectedUser = {
|
|
249
|
-
uid: "facebook-uid",
|
|
250
|
-
email: "facebook@example.com",
|
|
251
|
-
roles: [UserRole.PATIENT],
|
|
252
|
-
isAnonymous: false,
|
|
253
|
-
createdAt: expect.any(Date),
|
|
254
|
-
updatedAt: expect.any(Date),
|
|
255
|
-
lastLoginAt: expect.any(Date),
|
|
256
|
-
patientProfile: null,
|
|
257
|
-
practitionerProfile: null,
|
|
258
|
-
adminProfile: null,
|
|
259
|
-
};
|
|
260
|
-
|
|
261
|
-
const result = await service.signInWithFacebook();
|
|
262
|
-
|
|
263
|
-
expect(result).toEqual(expectedUser);
|
|
264
|
-
});
|
|
265
|
-
});
|
|
266
|
-
|
|
267
|
-
describe("signInWithApple", () => {
|
|
268
|
-
it("should sign in user with Apple", async () => {
|
|
269
|
-
const expectedUser = {
|
|
270
|
-
uid: "apple-uid",
|
|
271
|
-
email: "apple@example.com",
|
|
272
|
-
roles: [UserRole.PATIENT],
|
|
273
|
-
isAnonymous: false,
|
|
274
|
-
createdAt: expect.any(Date),
|
|
275
|
-
updatedAt: expect.any(Date),
|
|
276
|
-
lastLoginAt: expect.any(Date),
|
|
277
|
-
patientProfile: null,
|
|
278
|
-
practitionerProfile: null,
|
|
279
|
-
adminProfile: null,
|
|
280
|
-
};
|
|
281
|
-
|
|
282
|
-
const result = await service.signInWithApple();
|
|
283
|
-
|
|
284
|
-
expect(result).toEqual(expectedUser);
|
|
285
|
-
});
|
|
286
|
-
});
|
|
287
|
-
|
|
288
|
-
describe("signInAnonymously", () => {
|
|
289
|
-
it("should sign in user anonymously", async () => {
|
|
290
|
-
const expectedUser = {
|
|
291
|
-
uid: "test-uid",
|
|
292
|
-
email: null,
|
|
293
|
-
roles: [UserRole.PATIENT],
|
|
294
|
-
isAnonymous: true,
|
|
295
|
-
createdAt: expect.any(Date),
|
|
296
|
-
updatedAt: expect.any(Date),
|
|
297
|
-
lastLoginAt: expect.any(Date),
|
|
298
|
-
patientProfile: null,
|
|
299
|
-
practitionerProfile: null,
|
|
300
|
-
adminProfile: null,
|
|
301
|
-
};
|
|
302
|
-
|
|
303
|
-
const result = await service.signInAnonymously();
|
|
304
|
-
|
|
305
|
-
expect(result).toEqual(expectedUser);
|
|
306
|
-
});
|
|
307
|
-
});
|
|
308
|
-
|
|
309
|
-
describe("signOut", () => {
|
|
310
|
-
it("should sign out current user", async () => {
|
|
311
|
-
await expect(service.signOut()).resolves.not.toThrow();
|
|
312
|
-
});
|
|
313
|
-
});
|
|
314
|
-
|
|
315
|
-
describe("getCurrentUser", () => {
|
|
316
|
-
it("should return current user", async () => {
|
|
317
|
-
const expectedUser = {
|
|
318
|
-
uid: "test-uid",
|
|
319
|
-
email: "test@example.com",
|
|
320
|
-
roles: [UserRole.PATIENT],
|
|
321
|
-
isAnonymous: false,
|
|
322
|
-
createdAt: expect.any(Date),
|
|
323
|
-
updatedAt: expect.any(Date),
|
|
324
|
-
lastLoginAt: expect.any(Date),
|
|
325
|
-
patientProfile: null,
|
|
326
|
-
practitionerProfile: null,
|
|
327
|
-
adminProfile: null,
|
|
328
|
-
};
|
|
329
|
-
|
|
330
|
-
const result = await service.getCurrentUser();
|
|
331
|
-
|
|
332
|
-
expect(result).toEqual(expectedUser);
|
|
333
|
-
});
|
|
334
|
-
|
|
335
|
-
it("should return null when no user is signed in", async () => {
|
|
336
|
-
mockAuth.currentUser = null;
|
|
337
|
-
|
|
338
|
-
const result = await service.getCurrentUser();
|
|
339
|
-
|
|
340
|
-
expect(result).toBeNull();
|
|
341
|
-
|
|
342
|
-
// Vraćamo originalnu vrednost
|
|
343
|
-
mockAuth.currentUser = mockFirebaseUser as FirebaseUser;
|
|
344
|
-
});
|
|
345
|
-
});
|
|
346
|
-
});
|
|
1
|
+
// Mock Firebase Auth
|
|
2
|
+
const mockFirebaseUser = {
|
|
3
|
+
uid: "test-uid",
|
|
4
|
+
email: "test@example.com",
|
|
5
|
+
isAnonymous: false,
|
|
6
|
+
emailVerified: false,
|
|
7
|
+
metadata: {},
|
|
8
|
+
providerData: [],
|
|
9
|
+
refreshToken: "test-refresh-token",
|
|
10
|
+
tenantId: null,
|
|
11
|
+
delete: jest.fn(),
|
|
12
|
+
getIdToken: jest.fn(),
|
|
13
|
+
getIdTokenResult: jest.fn(),
|
|
14
|
+
reload: jest.fn(),
|
|
15
|
+
toJSON: jest.fn(),
|
|
16
|
+
displayName: null,
|
|
17
|
+
phoneNumber: null,
|
|
18
|
+
photoURL: null,
|
|
19
|
+
providerId: "firebase",
|
|
20
|
+
} as unknown as FirebaseUser;
|
|
21
|
+
|
|
22
|
+
const mockAnonymousUser = {
|
|
23
|
+
...mockFirebaseUser,
|
|
24
|
+
uid: "test-uid",
|
|
25
|
+
email: null,
|
|
26
|
+
isAnonymous: true,
|
|
27
|
+
} as unknown as FirebaseUser;
|
|
28
|
+
|
|
29
|
+
const mockAuth = {
|
|
30
|
+
currentUser: mockFirebaseUser as FirebaseUser | null,
|
|
31
|
+
signInWithEmailAndPassword: jest
|
|
32
|
+
.fn()
|
|
33
|
+
.mockImplementation((auth, email, password) => {
|
|
34
|
+
if (email === "invalid-email") {
|
|
35
|
+
throw new Error("Invalid email format");
|
|
36
|
+
}
|
|
37
|
+
if (password.length < 8) {
|
|
38
|
+
throw new Error("Password must be at least 8 characters");
|
|
39
|
+
}
|
|
40
|
+
return Promise.resolve({ user: mockFirebaseUser });
|
|
41
|
+
}),
|
|
42
|
+
createUserWithEmailAndPassword: jest
|
|
43
|
+
.fn()
|
|
44
|
+
.mockImplementation((auth, email, password) => {
|
|
45
|
+
if (email === "invalid-email") {
|
|
46
|
+
throw new Error("Invalid email format");
|
|
47
|
+
}
|
|
48
|
+
if (password.length < 8) {
|
|
49
|
+
throw new Error("Password must be at least 8 characters");
|
|
50
|
+
}
|
|
51
|
+
return Promise.resolve({ user: mockFirebaseUser });
|
|
52
|
+
}),
|
|
53
|
+
signInAnonymously: jest.fn().mockResolvedValue({ user: mockAnonymousUser }),
|
|
54
|
+
signOut: jest.fn().mockResolvedValue(undefined),
|
|
55
|
+
signInWithPopup: jest.fn().mockImplementation((auth, provider) => {
|
|
56
|
+
if (provider.providerId === "facebook.com") {
|
|
57
|
+
return Promise.resolve({ user: mockFacebookUser });
|
|
58
|
+
}
|
|
59
|
+
if (provider.providerId === "apple.com") {
|
|
60
|
+
return Promise.resolve({ user: mockAppleUser });
|
|
61
|
+
}
|
|
62
|
+
return Promise.resolve({ user: mockFirebaseUser });
|
|
63
|
+
}),
|
|
64
|
+
onAuthStateChanged: jest.fn(),
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
// Hoisting mocks
|
|
68
|
+
jest.mock("firebase/auth", () => ({
|
|
69
|
+
getAuth: jest.fn().mockReturnValue(mockAuth),
|
|
70
|
+
GoogleAuthProvider: jest.fn().mockImplementation(() => ({})),
|
|
71
|
+
FacebookAuthProvider: jest.fn().mockImplementation(() => ({})),
|
|
72
|
+
OAuthProvider: jest.fn().mockImplementation(() => ({})),
|
|
73
|
+
signInWithEmailAndPassword: jest
|
|
74
|
+
.fn()
|
|
75
|
+
.mockImplementation((auth, email, password) => {
|
|
76
|
+
if (email === "invalid-email") {
|
|
77
|
+
throw new Error("Invalid email format");
|
|
78
|
+
}
|
|
79
|
+
if (password.length < 8) {
|
|
80
|
+
throw new Error("Password must be at least 8 characters");
|
|
81
|
+
}
|
|
82
|
+
return Promise.resolve({ user: mockFirebaseUser });
|
|
83
|
+
}),
|
|
84
|
+
createUserWithEmailAndPassword: jest
|
|
85
|
+
.fn()
|
|
86
|
+
.mockImplementation((auth, email, password) => {
|
|
87
|
+
if (email === "invalid-email") {
|
|
88
|
+
throw new Error("Invalid email format");
|
|
89
|
+
}
|
|
90
|
+
if (password.length < 8) {
|
|
91
|
+
throw new Error("Password must be at least 8 characters");
|
|
92
|
+
}
|
|
93
|
+
return Promise.resolve({ user: mockFirebaseUser });
|
|
94
|
+
}),
|
|
95
|
+
signInAnonymously: jest.fn().mockResolvedValue({ user: mockAnonymousUser }),
|
|
96
|
+
signOut: jest.fn().mockResolvedValue(undefined),
|
|
97
|
+
signInWithPopup: jest.fn().mockImplementation((auth, provider) => {
|
|
98
|
+
if (provider.providerId === "facebook.com") {
|
|
99
|
+
return Promise.resolve({ user: mockFacebookUser });
|
|
100
|
+
}
|
|
101
|
+
if (provider.providerId === "apple.com") {
|
|
102
|
+
return Promise.resolve({ user: mockAppleUser });
|
|
103
|
+
}
|
|
104
|
+
return Promise.resolve({ user: mockFirebaseUser });
|
|
105
|
+
}),
|
|
106
|
+
onAuthStateChanged: jest.fn(),
|
|
107
|
+
}));
|
|
108
|
+
|
|
109
|
+
jest.mock("../../config/firebase", () => ({
|
|
110
|
+
initializeFirebase: jest.fn().mockResolvedValue({
|
|
111
|
+
app: {},
|
|
112
|
+
auth: mockAuth,
|
|
113
|
+
db: {},
|
|
114
|
+
analytics: null,
|
|
115
|
+
}),
|
|
116
|
+
getFirebaseInstance: jest.fn().mockResolvedValue({
|
|
117
|
+
db: {},
|
|
118
|
+
auth: mockAuth,
|
|
119
|
+
}),
|
|
120
|
+
}));
|
|
121
|
+
|
|
122
|
+
import { AuthService } from "../auth/auth.service";
|
|
123
|
+
import { User as FirebaseUser } from "firebase/auth";
|
|
124
|
+
import { UserRole } from "../../types";
|
|
125
|
+
|
|
126
|
+
const mockFacebookUser = {
|
|
127
|
+
...mockFirebaseUser,
|
|
128
|
+
uid: "facebook-uid",
|
|
129
|
+
email: "facebook@example.com",
|
|
130
|
+
} as unknown as FirebaseUser;
|
|
131
|
+
|
|
132
|
+
const mockAppleUser = {
|
|
133
|
+
...mockFirebaseUser,
|
|
134
|
+
uid: "apple-uid",
|
|
135
|
+
email: "apple@example.com",
|
|
136
|
+
} as unknown as FirebaseUser;
|
|
137
|
+
|
|
138
|
+
// Setup mocks
|
|
139
|
+
beforeAll(() => {
|
|
140
|
+
const { initializeFirebase } = require("../../config/firebase");
|
|
141
|
+
(initializeFirebase as jest.Mock).mockResolvedValue({
|
|
142
|
+
app: {},
|
|
143
|
+
auth: mockAuth,
|
|
144
|
+
db: {},
|
|
145
|
+
analytics: null,
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
describe("AuthService", () => {
|
|
150
|
+
let service: AuthService;
|
|
151
|
+
|
|
152
|
+
beforeEach(async () => {
|
|
153
|
+
service = new AuthService();
|
|
154
|
+
await service["initialized"]; // Čekamo da se inicijalizacija završi
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
afterEach(() => {
|
|
158
|
+
jest.clearAllMocks();
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
describe("signUp", () => {
|
|
162
|
+
it("should create a new user account with email and password", async () => {
|
|
163
|
+
const email = "test@example.com";
|
|
164
|
+
const password = "Password123!";
|
|
165
|
+
const expectedUser = {
|
|
166
|
+
uid: "test-uid",
|
|
167
|
+
email: "test@example.com",
|
|
168
|
+
roles: [UserRole.PATIENT],
|
|
169
|
+
isAnonymous: false,
|
|
170
|
+
createdAt: expect.any(Date),
|
|
171
|
+
updatedAt: expect.any(Date),
|
|
172
|
+
lastLoginAt: expect.any(Date),
|
|
173
|
+
patientProfile: {
|
|
174
|
+
firstName: "Test",
|
|
175
|
+
lastName: "User",
|
|
176
|
+
},
|
|
177
|
+
practitionerProfile: null,
|
|
178
|
+
adminProfile: null,
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
const result = await service.signUp(email, password, UserRole.PATIENT);
|
|
182
|
+
|
|
183
|
+
expect(result).toEqual(expectedUser);
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
it("should throw an error if email is invalid", async () => {
|
|
187
|
+
const email = "invalid-email";
|
|
188
|
+
const password = "Password123!";
|
|
189
|
+
|
|
190
|
+
await expect(
|
|
191
|
+
service.signUp(email, password, UserRole.PATIENT)
|
|
192
|
+
).rejects.toThrow("Invalid email format");
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
it("should throw an error if password is invalid", async () => {
|
|
196
|
+
const email = "test@example.com";
|
|
197
|
+
const password = "123"; // Prekratka lozinka
|
|
198
|
+
|
|
199
|
+
await expect(
|
|
200
|
+
service.signUp(email, password, UserRole.PATIENT)
|
|
201
|
+
).rejects.toThrow("Password must be at least 8 characters");
|
|
202
|
+
});
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
describe("signIn", () => {
|
|
206
|
+
it("should sign in user with email and password", async () => {
|
|
207
|
+
const email = "test@example.com";
|
|
208
|
+
const password = "Password123!";
|
|
209
|
+
const expectedUser = {
|
|
210
|
+
uid: "test-uid",
|
|
211
|
+
email: "test@example.com",
|
|
212
|
+
roles: [UserRole.PATIENT],
|
|
213
|
+
isAnonymous: false,
|
|
214
|
+
createdAt: expect.any(Date),
|
|
215
|
+
updatedAt: expect.any(Date),
|
|
216
|
+
lastLoginAt: expect.any(Date),
|
|
217
|
+
patientProfile: null,
|
|
218
|
+
practitionerProfile: null,
|
|
219
|
+
adminProfile: null,
|
|
220
|
+
};
|
|
221
|
+
|
|
222
|
+
const result = await service.signIn(email, password);
|
|
223
|
+
|
|
224
|
+
expect(result).toEqual(expectedUser);
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
it("should throw an error if email is invalid", async () => {
|
|
228
|
+
const email = "invalid-email";
|
|
229
|
+
const password = "Password123!";
|
|
230
|
+
|
|
231
|
+
await expect(service.signIn(email, password)).rejects.toThrow(
|
|
232
|
+
"Invalid email format"
|
|
233
|
+
);
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
it("should throw an error if password is invalid", async () => {
|
|
237
|
+
const email = "test@example.com";
|
|
238
|
+
const password = "123";
|
|
239
|
+
|
|
240
|
+
await expect(service.signIn(email, password)).rejects.toThrow(
|
|
241
|
+
"Password must be at least 8 characters"
|
|
242
|
+
);
|
|
243
|
+
});
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
describe("signInWithFacebook", () => {
|
|
247
|
+
it("should sign in user with Facebook", async () => {
|
|
248
|
+
const expectedUser = {
|
|
249
|
+
uid: "facebook-uid",
|
|
250
|
+
email: "facebook@example.com",
|
|
251
|
+
roles: [UserRole.PATIENT],
|
|
252
|
+
isAnonymous: false,
|
|
253
|
+
createdAt: expect.any(Date),
|
|
254
|
+
updatedAt: expect.any(Date),
|
|
255
|
+
lastLoginAt: expect.any(Date),
|
|
256
|
+
patientProfile: null,
|
|
257
|
+
practitionerProfile: null,
|
|
258
|
+
adminProfile: null,
|
|
259
|
+
};
|
|
260
|
+
|
|
261
|
+
const result = await service.signInWithFacebook();
|
|
262
|
+
|
|
263
|
+
expect(result).toEqual(expectedUser);
|
|
264
|
+
});
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
describe("signInWithApple", () => {
|
|
268
|
+
it("should sign in user with Apple", async () => {
|
|
269
|
+
const expectedUser = {
|
|
270
|
+
uid: "apple-uid",
|
|
271
|
+
email: "apple@example.com",
|
|
272
|
+
roles: [UserRole.PATIENT],
|
|
273
|
+
isAnonymous: false,
|
|
274
|
+
createdAt: expect.any(Date),
|
|
275
|
+
updatedAt: expect.any(Date),
|
|
276
|
+
lastLoginAt: expect.any(Date),
|
|
277
|
+
patientProfile: null,
|
|
278
|
+
practitionerProfile: null,
|
|
279
|
+
adminProfile: null,
|
|
280
|
+
};
|
|
281
|
+
|
|
282
|
+
const result = await service.signInWithApple();
|
|
283
|
+
|
|
284
|
+
expect(result).toEqual(expectedUser);
|
|
285
|
+
});
|
|
286
|
+
});
|
|
287
|
+
|
|
288
|
+
describe("signInAnonymously", () => {
|
|
289
|
+
it("should sign in user anonymously", async () => {
|
|
290
|
+
const expectedUser = {
|
|
291
|
+
uid: "test-uid",
|
|
292
|
+
email: null,
|
|
293
|
+
roles: [UserRole.PATIENT],
|
|
294
|
+
isAnonymous: true,
|
|
295
|
+
createdAt: expect.any(Date),
|
|
296
|
+
updatedAt: expect.any(Date),
|
|
297
|
+
lastLoginAt: expect.any(Date),
|
|
298
|
+
patientProfile: null,
|
|
299
|
+
practitionerProfile: null,
|
|
300
|
+
adminProfile: null,
|
|
301
|
+
};
|
|
302
|
+
|
|
303
|
+
const result = await service.signInAnonymously();
|
|
304
|
+
|
|
305
|
+
expect(result).toEqual(expectedUser);
|
|
306
|
+
});
|
|
307
|
+
});
|
|
308
|
+
|
|
309
|
+
describe("signOut", () => {
|
|
310
|
+
it("should sign out current user", async () => {
|
|
311
|
+
await expect(service.signOut()).resolves.not.toThrow();
|
|
312
|
+
});
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
describe("getCurrentUser", () => {
|
|
316
|
+
it("should return current user", async () => {
|
|
317
|
+
const expectedUser = {
|
|
318
|
+
uid: "test-uid",
|
|
319
|
+
email: "test@example.com",
|
|
320
|
+
roles: [UserRole.PATIENT],
|
|
321
|
+
isAnonymous: false,
|
|
322
|
+
createdAt: expect.any(Date),
|
|
323
|
+
updatedAt: expect.any(Date),
|
|
324
|
+
lastLoginAt: expect.any(Date),
|
|
325
|
+
patientProfile: null,
|
|
326
|
+
practitionerProfile: null,
|
|
327
|
+
adminProfile: null,
|
|
328
|
+
};
|
|
329
|
+
|
|
330
|
+
const result = await service.getCurrentUser();
|
|
331
|
+
|
|
332
|
+
expect(result).toEqual(expectedUser);
|
|
333
|
+
});
|
|
334
|
+
|
|
335
|
+
it("should return null when no user is signed in", async () => {
|
|
336
|
+
mockAuth.currentUser = null;
|
|
337
|
+
|
|
338
|
+
const result = await service.getCurrentUser();
|
|
339
|
+
|
|
340
|
+
expect(result).toBeNull();
|
|
341
|
+
|
|
342
|
+
// Vraćamo originalnu vrednost
|
|
343
|
+
mockAuth.currentUser = mockFirebaseUser as FirebaseUser;
|
|
344
|
+
});
|
|
345
|
+
});
|
|
346
|
+
});
|