@contentpass/react-native-contentpass 0.3.18 → 0.4.1
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 +109 -79
- package/docs/CONTRIBUTING.md +7 -7
- package/lib/commonjs/Contentpass.js +38 -25
- package/lib/commonjs/Contentpass.js.map +1 -1
- package/lib/commonjs/Contentpass.test.js +455 -0
- package/lib/commonjs/Contentpass.test.js.map +1 -0
- package/lib/commonjs/OidcAuthStateStorage.test.js +59 -0
- package/lib/commonjs/OidcAuthStateStorage.test.js.map +1 -0
- package/lib/commonjs/contentpassTokenUtils/fetchContentpassToken.test.js +45 -0
- package/lib/commonjs/contentpassTokenUtils/fetchContentpassToken.test.js.map +1 -0
- package/lib/commonjs/contentpassTokenUtils/parseContentpassToken.test.js +31 -0
- package/lib/commonjs/contentpassTokenUtils/parseContentpassToken.test.js.map +1 -0
- package/lib/commonjs/contentpassTokenUtils/validateSubscription.test.js +73 -0
- package/lib/commonjs/contentpassTokenUtils/validateSubscription.test.js.map +1 -0
- package/lib/commonjs/countImpressionUtils/sendPageViewEvent.test.js +35 -0
- package/lib/commonjs/countImpressionUtils/sendPageViewEvent.test.js.map +1 -0
- package/lib/commonjs/countImpressionUtils/sendStats.js +1 -1
- package/lib/commonjs/countImpressionUtils/sendStats.js.map +1 -1
- package/lib/commonjs/countImpressionUtils/sendStats.test.js +39 -0
- package/lib/commonjs/countImpressionUtils/sendStats.test.js.map +1 -0
- package/lib/commonjs/index.js +2 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/logger.test.js +42 -0
- package/lib/commonjs/logger.test.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/sdkContext/ContentpassSdkProvder.test.js +33 -0
- package/lib/commonjs/sdkContext/ContentpassSdkProvder.test.js.map +1 -0
- package/lib/commonjs/sdkContext/useContentpassSdk.test.js +37 -0
- package/lib/commonjs/sdkContext/useContentpassSdk.test.js.map +1 -0
- package/lib/commonjs/sdkContext/useContentpassState.js +26 -0
- package/lib/commonjs/sdkContext/useContentpassState.js.map +1 -0
- package/lib/commonjs/sentryIntegration.test.js +131 -0
- package/lib/commonjs/sentryIntegration.test.js.map +1 -0
- package/lib/commonjs/types/CmpAdapter.js +2 -0
- package/lib/commonjs/types/CmpAdapter.js.map +1 -0
- package/lib/module/Contentpass.js +38 -25
- package/lib/module/Contentpass.js.map +1 -1
- package/lib/module/Contentpass.test.js +448 -0
- package/lib/module/Contentpass.test.js.map +1 -0
- package/lib/module/OidcAuthStateStorage.test.js +56 -0
- package/lib/module/OidcAuthStateStorage.test.js.map +1 -0
- package/lib/module/contentpassTokenUtils/fetchContentpassToken.test.js +44 -0
- package/lib/module/contentpassTokenUtils/fetchContentpassToken.test.js.map +1 -0
- package/lib/module/contentpassTokenUtils/parseContentpassToken.test.js +30 -0
- package/lib/module/contentpassTokenUtils/parseContentpassToken.test.js.map +1 -0
- package/lib/module/contentpassTokenUtils/validateSubscription.test.js +70 -0
- package/lib/module/contentpassTokenUtils/validateSubscription.test.js.map +1 -0
- package/lib/module/countImpressionUtils/sendPageViewEvent.test.js +34 -0
- package/lib/module/countImpressionUtils/sendPageViewEvent.test.js.map +1 -0
- package/lib/module/countImpressionUtils/sendStats.js +1 -1
- package/lib/module/countImpressionUtils/sendStats.js.map +1 -1
- package/lib/module/countImpressionUtils/sendStats.test.js +38 -0
- package/lib/module/countImpressionUtils/sendStats.test.js.map +1 -0
- package/lib/module/index.js +6 -3
- package/lib/module/index.js.map +1 -1
- package/lib/module/logger.test.js +40 -0
- package/lib/module/logger.test.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/sdkContext/ContentpassSdkProvder.test.js +32 -0
- package/lib/module/sdkContext/ContentpassSdkProvder.test.js.map +1 -0
- package/lib/module/sdkContext/useContentpassSdk.test.js +36 -0
- package/lib/module/sdkContext/useContentpassSdk.test.js.map +1 -0
- package/lib/module/sdkContext/useContentpassState.js +21 -0
- package/lib/module/sdkContext/useContentpassState.js.map +1 -0
- package/lib/module/sentryIntegration.test.js +128 -0
- package/lib/module/sentryIntegration.test.js.map +1 -0
- package/lib/module/types/CmpAdapter.js +2 -0
- package/lib/module/types/CmpAdapter.js.map +1 -0
- package/lib/typescript/commonjs/src/Contentpass.d.ts +8 -5
- package/lib/typescript/commonjs/src/Contentpass.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/countImpressionUtils/sendStats.d.ts +1 -0
- package/lib/typescript/commonjs/src/countImpressionUtils/sendStats.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/index.d.ts +11 -6
- package/lib/typescript/commonjs/src/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/logger.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/sdkContext/ContentpassSdkProvider.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/sdkContext/useContentpassState.d.ts +4 -0
- package/lib/typescript/commonjs/src/sdkContext/useContentpassState.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/sentryIntegration.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/types/CmpAdapter.d.ts +14 -0
- package/lib/typescript/commonjs/src/types/CmpAdapter.d.ts.map +1 -0
- package/lib/typescript/module/src/Contentpass.d.ts +8 -5
- package/lib/typescript/module/src/Contentpass.d.ts.map +1 -1
- package/lib/typescript/module/src/countImpressionUtils/sendStats.d.ts +1 -0
- package/lib/typescript/module/src/countImpressionUtils/sendStats.d.ts.map +1 -1
- package/lib/typescript/module/src/index.d.ts +11 -6
- package/lib/typescript/module/src/index.d.ts.map +1 -1
- package/lib/typescript/module/src/logger.d.ts.map +1 -1
- package/lib/typescript/module/src/sdkContext/ContentpassSdkProvider.d.ts.map +1 -1
- package/lib/typescript/module/src/sdkContext/useContentpassState.d.ts +4 -0
- package/lib/typescript/module/src/sdkContext/useContentpassState.d.ts.map +1 -0
- package/lib/typescript/module/src/sentryIntegration.d.ts.map +1 -1
- package/lib/typescript/module/src/types/CmpAdapter.d.ts +14 -0
- package/lib/typescript/module/src/types/CmpAdapter.d.ts.map +1 -0
- package/package.json +24 -59
- package/LICENSE +0 -20
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import EncryptedStorage from 'react-native-encrypted-storage';
|
|
4
|
+
import OidcAuthStateStorage from "./OidcAuthStateStorage.js";
|
|
5
|
+
import * as SentryIntegrationModule from "./sentryIntegration.js";
|
|
6
|
+
describe('OidcAuthStateStorage', () => {
|
|
7
|
+
const CLIENT_ID = 'test-client-id';
|
|
8
|
+
const EXPECTED_STORAGE_KEY = `de.contentpass.${CLIENT_ID}-OIDCAuthState`;
|
|
9
|
+
let storage;
|
|
10
|
+
let reportErrorSpy;
|
|
11
|
+
const mockAuthState = {
|
|
12
|
+
accessToken: 'test-access-token',
|
|
13
|
+
accessTokenExpirationDate: '2023-12-31T23:59:59Z',
|
|
14
|
+
idToken: 'test-id-token',
|
|
15
|
+
refreshToken: 'test-refresh-token',
|
|
16
|
+
tokenType: 'Bearer'
|
|
17
|
+
};
|
|
18
|
+
beforeEach(() => {
|
|
19
|
+
storage = new OidcAuthStateStorage(CLIENT_ID);
|
|
20
|
+
reportErrorSpy = jest.spyOn(SentryIntegrationModule, 'reportError').mockReturnValue(undefined);
|
|
21
|
+
});
|
|
22
|
+
afterEach(() => {
|
|
23
|
+
jest.resetAllMocks();
|
|
24
|
+
jest.restoreAllMocks();
|
|
25
|
+
});
|
|
26
|
+
it('should store OIDC auth state', async () => {
|
|
27
|
+
await storage.storeOidcAuthState(mockAuthState);
|
|
28
|
+
expect(EncryptedStorage.setItem).toHaveBeenCalledWith(EXPECTED_STORAGE_KEY, '{"accessToken":"test-access-token","accessTokenExpirationDate":"2023-12-31T23:59:59Z","idToken":"test-id-token","refreshToken":"test-refresh-token","tokenType":"Bearer"}');
|
|
29
|
+
});
|
|
30
|
+
it('should get OIDC auth state', async () => {
|
|
31
|
+
EncryptedStorage.getItem.mockResolvedValue('{"accessToken":"test-access-token","accessTokenExpirationDate":"2023-12-31T23:59:59Z","idToken":"test-id-token","refreshToken":"test-refresh-token","tokenType":"Bearer"}');
|
|
32
|
+
const result = await storage.getOidcAuthState();
|
|
33
|
+
expect(EncryptedStorage.getItem).toHaveBeenCalledWith(EXPECTED_STORAGE_KEY);
|
|
34
|
+
expect(result).toEqual(mockAuthState);
|
|
35
|
+
});
|
|
36
|
+
it('should return undefined if no OIDC auth state is found', async () => {
|
|
37
|
+
EncryptedStorage.getItem.mockResolvedValue(null);
|
|
38
|
+
const result = await storage.getOidcAuthState();
|
|
39
|
+
expect(EncryptedStorage.getItem).toHaveBeenCalledWith(EXPECTED_STORAGE_KEY);
|
|
40
|
+
expect(result).toBeUndefined();
|
|
41
|
+
});
|
|
42
|
+
it('should clear OIDC auth state', async () => {
|
|
43
|
+
await storage.clearOidcAuthState();
|
|
44
|
+
expect(EncryptedStorage.removeItem).toHaveBeenCalledWith(EXPECTED_STORAGE_KEY);
|
|
45
|
+
});
|
|
46
|
+
it('should report error if clearing OIDC auth state fails', async () => {
|
|
47
|
+
const error = new Error('test-error');
|
|
48
|
+
EncryptedStorage.removeItem.mockRejectedValue(error);
|
|
49
|
+
await storage.clearOidcAuthState();
|
|
50
|
+
expect(EncryptedStorage.removeItem).toHaveBeenCalledWith(EXPECTED_STORAGE_KEY);
|
|
51
|
+
expect(reportErrorSpy).toHaveBeenCalledWith(error, {
|
|
52
|
+
msg: 'Failed to clear OIDC auth state. Most probably we tried to remove item which does not exist'
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
//# sourceMappingURL=OidcAuthStateStorage.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["EncryptedStorage","OidcAuthStateStorage","SentryIntegrationModule","describe","CLIENT_ID","EXPECTED_STORAGE_KEY","storage","reportErrorSpy","mockAuthState","accessToken","accessTokenExpirationDate","idToken","refreshToken","tokenType","beforeEach","jest","spyOn","mockReturnValue","undefined","afterEach","resetAllMocks","restoreAllMocks","it","storeOidcAuthState","expect","setItem","toHaveBeenCalledWith","getItem","mockResolvedValue","result","getOidcAuthState","toEqual","toBeUndefined","clearOidcAuthState","removeItem","error","Error","mockRejectedValue","msg"],"sourceRoot":"../../src","sources":["OidcAuthStateStorage.test.ts"],"mappings":";;AAAA,OAAOA,gBAAgB,MAAM,gCAAgC;AAC7D,OAAOC,oBAAoB,MAEpB,2BAAwB;AAC/B,OAAO,KAAKC,uBAAuB,MAAM,wBAAqB;AAE9DC,QAAQ,CAAC,sBAAsB,EAAE,MAAM;EACrC,MAAMC,SAAS,GAAG,gBAAgB;EAClC,MAAMC,oBAAoB,GAAG,kBAAkBD,SAAS,gBAAgB;EAExE,IAAIE,OAA6B;EACjC,IAAIC,cAAgC;EACpC,MAAMC,aAA4B,GAAG;IACnCC,WAAW,EAAE,mBAAmB;IAChCC,yBAAyB,EAAE,sBAAsB;IACjDC,OAAO,EAAE,eAAe;IACxBC,YAAY,EAAE,oBAAoB;IAClCC,SAAS,EAAE;EACb,CAAC;EAEDC,UAAU,CAAC,MAAM;IACfR,OAAO,GAAG,IAAIL,oBAAoB,CAACG,SAAS,CAAC;IAC7CG,cAAc,GAAGQ,IAAI,CAClBC,KAAK,CAACd,uBAAuB,EAAE,aAAa,CAAC,CAC7Ce,eAAe,CAACC,SAAS,CAAC;EAC/B,CAAC,CAAC;EAEFC,SAAS,CAAC,MAAM;IACdJ,IAAI,CAACK,aAAa,CAAC,CAAC;IACpBL,IAAI,CAACM,eAAe,CAAC,CAAC;EACxB,CAAC,CAAC;EAEFC,EAAE,CAAC,8BAA8B,EAAE,YAAY;IAC7C,MAAMhB,OAAO,CAACiB,kBAAkB,CAACf,aAAa,CAAC;IAE/CgB,MAAM,CAACxB,gBAAgB,CAACyB,OAAO,CAAC,CAACC,oBAAoB,CACnDrB,oBAAoB,EACpB,2KACF,CAAC;EACH,CAAC,CAAC;EAEFiB,EAAE,CAAC,4BAA4B,EAAE,YAAY;IAC1CtB,gBAAgB,CAAC2B,OAAO,CAAeC,iBAAiB,CACvD,2KACF,CAAC;IACD,MAAMC,MAAM,GAAG,MAAMvB,OAAO,CAACwB,gBAAgB,CAAC,CAAC;IAE/CN,MAAM,CAACxB,gBAAgB,CAAC2B,OAAO,CAAC,CAACD,oBAAoB,CAACrB,oBAAoB,CAAC;IAC3EmB,MAAM,CAACK,MAAM,CAAC,CAACE,OAAO,CAACvB,aAAa,CAAC;EACvC,CAAC,CAAC;EAEFc,EAAE,CAAC,wDAAwD,EAAE,YAAY;IACtEtB,gBAAgB,CAAC2B,OAAO,CAAeC,iBAAiB,CAAC,IAAI,CAAC;IAC/D,MAAMC,MAAM,GAAG,MAAMvB,OAAO,CAACwB,gBAAgB,CAAC,CAAC;IAE/CN,MAAM,CAACxB,gBAAgB,CAAC2B,OAAO,CAAC,CAACD,oBAAoB,CAACrB,oBAAoB,CAAC;IAC3EmB,MAAM,CAACK,MAAM,CAAC,CAACG,aAAa,CAAC,CAAC;EAChC,CAAC,CAAC;EAEFV,EAAE,CAAC,8BAA8B,EAAE,YAAY;IAC7C,MAAMhB,OAAO,CAAC2B,kBAAkB,CAAC,CAAC;IAElCT,MAAM,CAACxB,gBAAgB,CAACkC,UAAU,CAAC,CAACR,oBAAoB,CACtDrB,oBACF,CAAC;EACH,CAAC,CAAC;EAEFiB,EAAE,CAAC,uDAAuD,EAAE,YAAY;IACtE,MAAMa,KAAK,GAAG,IAAIC,KAAK,CAAC,YAAY,CAAC;IACpCpC,gBAAgB,CAACkC,UAAU,CAAeG,iBAAiB,CAACF,KAAK,CAAC;IAEnE,MAAM7B,OAAO,CAAC2B,kBAAkB,CAAC,CAAC;IAElCT,MAAM,CAACxB,gBAAgB,CAACkC,UAAU,CAAC,CAACR,oBAAoB,CACtDrB,oBACF,CAAC;IACDmB,MAAM,CAACjB,cAAc,CAAC,CAACmB,oBAAoB,CAACS,KAAK,EAAE;MACjDG,GAAG,EAAE;IACP,CAAC,CAAC;EACJ,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import fetchContentpassToken from "./fetchContentpassToken.js";
|
|
4
|
+
describe('fetchContentpassToken', () => {
|
|
5
|
+
afterEach(() => {
|
|
6
|
+
jest.resetAllMocks();
|
|
7
|
+
jest.restoreAllMocks();
|
|
8
|
+
});
|
|
9
|
+
it('should return the contentpass token', async () => {
|
|
10
|
+
jest.spyOn(global, 'fetch').mockResolvedValue({
|
|
11
|
+
ok: true,
|
|
12
|
+
json: jest.fn().mockResolvedValue({
|
|
13
|
+
contentpass_token: 'example_contentpass_token'
|
|
14
|
+
})
|
|
15
|
+
});
|
|
16
|
+
const result = await fetchContentpassToken({
|
|
17
|
+
idToken: '123456',
|
|
18
|
+
propertyId: '987654321',
|
|
19
|
+
issuer: 'https://issuer.com'
|
|
20
|
+
});
|
|
21
|
+
expect(result).toBe('example_contentpass_token');
|
|
22
|
+
expect(global.fetch).toHaveBeenCalledWith('https://issuer.com/auth/oidc/token', {
|
|
23
|
+
body: 'grant_type=contentpass_token&subject_token=123456&client_id=987654321',
|
|
24
|
+
method: 'POST',
|
|
25
|
+
headers: {
|
|
26
|
+
'Content-Type': 'application/x-www-form-urlencoded'
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
it('should throw an error if the fetch fails', async () => {
|
|
31
|
+
jest.spyOn(global, 'fetch').mockResolvedValue({
|
|
32
|
+
ok: false,
|
|
33
|
+
statusText: 'Not Found'
|
|
34
|
+
});
|
|
35
|
+
await expect(async () => {
|
|
36
|
+
await fetchContentpassToken({
|
|
37
|
+
idToken: '123456',
|
|
38
|
+
propertyId: '987654321',
|
|
39
|
+
issuer: 'https://issuer.com'
|
|
40
|
+
});
|
|
41
|
+
}).rejects.toThrow('Failed to fetch Contentpass token, status: Not Found');
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
//# sourceMappingURL=fetchContentpassToken.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["fetchContentpassToken","describe","afterEach","jest","resetAllMocks","restoreAllMocks","it","spyOn","global","mockResolvedValue","ok","json","fn","contentpass_token","result","idToken","propertyId","issuer","expect","toBe","fetch","toHaveBeenCalledWith","body","method","headers","statusText","rejects","toThrow"],"sourceRoot":"../../../src","sources":["contentpassTokenUtils/fetchContentpassToken.test.ts"],"mappings":";;AAAA,OAAOA,qBAAqB,MAAM,4BAAyB;AAE3DC,QAAQ,CAAC,uBAAuB,EAAE,MAAM;EACtCC,SAAS,CAAC,MAAM;IACdC,IAAI,CAACC,aAAa,CAAC,CAAC;IACpBD,IAAI,CAACE,eAAe,CAAC,CAAC;EACxB,CAAC,CAAC;EAEFC,EAAE,CAAC,qCAAqC,EAAE,YAAY;IACpDH,IAAI,CAACI,KAAK,CAACC,MAAM,EAAE,OAAO,CAAC,CAACC,iBAAiB,CAAC;MAC5CC,EAAE,EAAE,IAAI;MACRC,IAAI,EAAER,IAAI,CACPS,EAAE,CAAC,CAAC,CACJH,iBAAiB,CAAC;QAAEI,iBAAiB,EAAE;MAA4B,CAAC;IACzE,CAAQ,CAAC;IAET,MAAMC,MAAM,GAAG,MAAMd,qBAAqB,CAAC;MACzCe,OAAO,EAAE,QAAQ;MACjBC,UAAU,EAAE,WAAW;MACvBC,MAAM,EAAE;IACV,CAAC,CAAC;IAEFC,MAAM,CAACJ,MAAM,CAAC,CAACK,IAAI,CAAC,2BAA2B,CAAC;IAChDD,MAAM,CAACV,MAAM,CAACY,KAAK,CAAC,CAACC,oBAAoB,CACvC,oCAAoC,EACpC;MACEC,IAAI,EAAE,uEAAuE;MAC7EC,MAAM,EAAE,MAAM;MACdC,OAAO,EAAE;QACP,cAAc,EAAE;MAClB;IACF,CACF,CAAC;EACH,CAAC,CAAC;EAEFlB,EAAE,CAAC,0CAA0C,EAAE,YAAY;IACzDH,IAAI,CAACI,KAAK,CAACC,MAAM,EAAE,OAAO,CAAC,CAACC,iBAAiB,CAAC;MAC5CC,EAAE,EAAE,KAAK;MACTe,UAAU,EAAE;IACd,CAAQ,CAAC;IAET,MAAMP,MAAM,CAAC,YAAY;MACvB,MAAMlB,qBAAqB,CAAC;QAC1Be,OAAO,EAAE,QAAQ;QACjBC,UAAU,EAAE,WAAW;QACvBC,MAAM,EAAE;MACV,CAAC,CAAC;IACJ,CAAC,CAAC,CAACS,OAAO,CAACC,OAAO,CAAC,sDAAsD,CAAC;EAC5E,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import parseContentpassToken from "./parseContentpassToken.js";
|
|
4
|
+
describe('parseContentpassToken', () => {
|
|
5
|
+
it('should parse the contentpass token', () => {
|
|
6
|
+
const exampleToken = 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjY5NzUwYTZjLTNmYjctNDUyNi05NWY4LTVhZmYxMmIyZjFjOSJ9.eyJhdXRoIjp0cnVlLCJ0eXBlIjoiY3AiLCJwbGFucyI6WyIwYWNhZTkxNy1iZTk5LTQ4ZWEtYjhmMS0yMGZhNjhhNDdkM2EiLCI0NDIxNjI4Yy05NjA2LTRjMDEtOGU1ZC1jMmE5YmNhNjhhYjQiLCI3ZThkZTBjYy0zZTk3LTQ5YTItODgxZC05ZmZiNWI4NDE1MTUiLCJhNDcyMWRiNS02N2RmLTQxNDUtYmJiZi1jYmQwOWY3ZTAzOTciLCJjNGQzYjBmNS05ODlhLTRmN2ItOGFjNy0zZDhmZmE5NTcxN2YiLCI2NGRkOTkwNS05NmUxLTRmYjItOTgwZC01MDdmMTYzNzVmZTkiXSwiYXVkIjoiY2MzZmM0YWQiLCJpYXQiOjE3MzMxMzU2ODEsImV4cCI6MTczMzMxMjA4MX0.CMtH7HRLf2HVgw3_cZRN0en8tml_SQKM73iLGJAp72-vJuRJaq85xBp6Jgy9WD3L7x4itRlBAYZxX8tLxZGogU0WP4_dMGFQ2QlcwKshwJygwRM1YqvxGWX2Az_KxEMc2QGHvpE1qe2MAr_xOU7VFfc0-vWxFc3hRzpAM5j7YHctj2t1v6h9-M7V2Hkcn37569QmtgU8gJkUxXsgUTufbb1ikjjjAvnjvTluHJo51_utbimpUbCk3EFxXVCVEI_pAqiZQXNninUQ6dbSujLb3L2UlEdQzLeUiBdYroeFzSyruLrR841ledLQ5ZP2OqzF5oUMuAGVOOhmgGdwGMCDRQ';
|
|
7
|
+
const result = parseContentpassToken(exampleToken);
|
|
8
|
+
expect(result).toEqual({
|
|
9
|
+
body: {
|
|
10
|
+
aud: 'cc3fc4ad',
|
|
11
|
+
auth: true,
|
|
12
|
+
exp: 1733312081,
|
|
13
|
+
iat: 1733135681,
|
|
14
|
+
plans: ['0acae917-be99-48ea-b8f1-20fa68a47d3a', '4421628c-9606-4c01-8e5d-c2a9bca68ab4', '7e8de0cc-3e97-49a2-881d-9ffb5b841515', 'a4721db5-67df-4145-bbbf-cbd09f7e0397', 'c4d3b0f5-989a-4f7b-8ac7-3d8ffa95717f', '64dd9905-96e1-4fb2-980d-507f16375fe9'],
|
|
15
|
+
type: 'cp'
|
|
16
|
+
},
|
|
17
|
+
header: {
|
|
18
|
+
alg: 'RS256',
|
|
19
|
+
kid: '69750a6c-3fb7-4526-95f8-5aff12b2f1c9'
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
it('should throw an error if the token is invalid', () => {
|
|
24
|
+
const invalidToken = 'eyJhdXRoIjp0cnVlLCJ0eXBlIjoiY3AiLCJwbGFucyI6WyIwYWNhZTkxNy1iZTk5LTQ4ZWEtYjhmMS0yMGZhNjhhNDdkM2EiLCI0NDIxNjI4Yy05NjA2LTRjMDEtOGU1ZC1jMmE5YmNhNjhhYjQiLCI3ZThkZTBjYy0zZTk3LTQ5YTItODgxZC05ZmZiNWI4NDE1MTUiLCJhNDcyMWRiNS02N2RmLTQxNDUtYmJiZi1jYmQwOWY3ZTAzOTciLCJjNGQzYjBmNS05ODlhLTRmN2ItOGFjNy0zZDhmZmE5NTcxN2YiLCI2NGRkOTkwNS05NmUxLTRmYjItOTgwZC01MDdmMTYzNzVmZTkiXSwiYXVkIjoiY2MzZmM0YWQiLCJpYXQiOjE3MzMxMzU2ODEsImV4cCI6MTczMzMxMjA4MX0.CMtH7HRLf2HVgw3_cZRN0en8tml_SQKM73iLGJAp72-vJuRJaq85xBp6Jgy9WD3L7x4itRlBAYZxX8tLxZGogU0WP4_dMGFQ2QlcwKshwJygwRM1YqvxGWX2Az_KxEMc2QGHvpE1qe2MAr_xOU7VFfc0-vWxFc3hRzpAM5j7YHctj2t1v6h9-M7V2Hkcn37569QmtgU8gJkUxXsgUTufbb1ikjjjAvnjvTluHJo51_utbimpUbCk3EFxXVCVEI_pAqiZQXNninUQ6dbSujLb3L2UlEdQzLeUiBdYroeFzSyruLrR841ledLQ5ZP2OqzF5oUMuAGVOOhmgGdwGMCDRQ';
|
|
25
|
+
expect(() => {
|
|
26
|
+
parseContentpassToken(invalidToken);
|
|
27
|
+
}).toThrow('Invalid token, token should have at least 3 parts');
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
//# sourceMappingURL=parseContentpassToken.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["parseContentpassToken","describe","it","exampleToken","result","expect","toEqual","body","aud","auth","exp","iat","plans","type","header","alg","kid","invalidToken","toThrow"],"sourceRoot":"../../../src","sources":["contentpassTokenUtils/parseContentpassToken.test.ts"],"mappings":";;AAAA,OAAOA,qBAAqB,MAAM,4BAAyB;AAE3DC,QAAQ,CAAC,uBAAuB,EAAE,MAAM;EACtCC,EAAE,CAAC,oCAAoC,EAAE,MAAM;IAC7C,MAAMC,YAAY,GAChB,q1BAAq1B;IAEv1B,MAAMC,MAAM,GAAGJ,qBAAqB,CAACG,YAAY,CAAC;IAElDE,MAAM,CAACD,MAAM,CAAC,CAACE,OAAO,CAAC;MACrBC,IAAI,EAAE;QACJC,GAAG,EAAE,UAAU;QACfC,IAAI,EAAE,IAAI;QACVC,GAAG,EAAE,UAAU;QACfC,GAAG,EAAE,UAAU;QACfC,KAAK,EAAE,CACL,sCAAsC,EACtC,sCAAsC,EACtC,sCAAsC,EACtC,sCAAsC,EACtC,sCAAsC,EACtC,sCAAsC,CACvC;QACDC,IAAI,EAAE;MACR,CAAC;MACDC,MAAM,EAAE;QACNC,GAAG,EAAE,OAAO;QACZC,GAAG,EAAE;MACP;IACF,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFd,EAAE,CAAC,+CAA+C,EAAE,MAAM;IACxD,MAAMe,YAAY,GAChB,owBAAowB;IAEtwBZ,MAAM,CAAC,MAAM;MACXL,qBAAqB,CAACiB,YAAY,CAAC;IACrC,CAAC,CAAC,CAACC,OAAO,CAAC,mDAAmD,CAAC;EACjE,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import * as ParseContentpassTokenModule from "./parseContentpassToken.js";
|
|
4
|
+
import * as SentryIntegrationModule from "../sentryIntegration.js";
|
|
5
|
+
import validateSubscription from "./validateSubscription.js";
|
|
6
|
+
const EXAMPLE_CONTENTPASS_TOKEN = {
|
|
7
|
+
body: {
|
|
8
|
+
aud: 'cc3fc4ad',
|
|
9
|
+
auth: true,
|
|
10
|
+
exp: 1733312081,
|
|
11
|
+
iat: 1733135681,
|
|
12
|
+
type: 'cp',
|
|
13
|
+
plans: ['planId1']
|
|
14
|
+
},
|
|
15
|
+
header: {
|
|
16
|
+
alg: 'RS256',
|
|
17
|
+
kid: 'kid'
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
describe('validateSubscription', () => {
|
|
21
|
+
let parseContentpassTokenSpy;
|
|
22
|
+
let reportErrorSpy;
|
|
23
|
+
beforeEach(() => {
|
|
24
|
+
parseContentpassTokenSpy = jest.spyOn(ParseContentpassTokenModule, 'default').mockReturnValue(EXAMPLE_CONTENTPASS_TOKEN);
|
|
25
|
+
reportErrorSpy = jest.spyOn(SentryIntegrationModule, 'reportError').mockReturnValue(undefined);
|
|
26
|
+
});
|
|
27
|
+
afterEach(() => {
|
|
28
|
+
jest.resetAllMocks();
|
|
29
|
+
jest.restoreAllMocks();
|
|
30
|
+
});
|
|
31
|
+
it('should return true if the token is valid', () => {
|
|
32
|
+
parseContentpassTokenSpy.mockReturnValue(EXAMPLE_CONTENTPASS_TOKEN);
|
|
33
|
+
const result = validateSubscription('example_contentpass_token');
|
|
34
|
+
expect(result).toBe(true);
|
|
35
|
+
});
|
|
36
|
+
it('should return false and report error if the token is invalid', () => {
|
|
37
|
+
const error = new Error('Invalid token');
|
|
38
|
+
parseContentpassTokenSpy.mockImplementation(() => {
|
|
39
|
+
throw error;
|
|
40
|
+
});
|
|
41
|
+
const result = validateSubscription('example_contentpass_token');
|
|
42
|
+
expect(result).toBe(false);
|
|
43
|
+
expect(reportErrorSpy).toHaveBeenCalledWith(error, {
|
|
44
|
+
msg: 'Failed to validate subscription'
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
it('should return false if the user is not authenticated', () => {
|
|
48
|
+
parseContentpassTokenSpy.mockReturnValue({
|
|
49
|
+
...EXAMPLE_CONTENTPASS_TOKEN,
|
|
50
|
+
body: {
|
|
51
|
+
...EXAMPLE_CONTENTPASS_TOKEN.body,
|
|
52
|
+
auth: false
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
const result = validateSubscription('example_contentpass_token');
|
|
56
|
+
expect(result).toBe(false);
|
|
57
|
+
});
|
|
58
|
+
it('should return false if the user has no plans', () => {
|
|
59
|
+
parseContentpassTokenSpy.mockReturnValue({
|
|
60
|
+
...EXAMPLE_CONTENTPASS_TOKEN,
|
|
61
|
+
body: {
|
|
62
|
+
...EXAMPLE_CONTENTPASS_TOKEN.body,
|
|
63
|
+
plans: []
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
const result = validateSubscription('example_contentpass_token');
|
|
67
|
+
expect(result).toBe(false);
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
//# sourceMappingURL=validateSubscription.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["ParseContentpassTokenModule","SentryIntegrationModule","validateSubscription","EXAMPLE_CONTENTPASS_TOKEN","body","aud","auth","exp","iat","type","plans","header","alg","kid","describe","parseContentpassTokenSpy","reportErrorSpy","beforeEach","jest","spyOn","mockReturnValue","undefined","afterEach","resetAllMocks","restoreAllMocks","it","result","expect","toBe","error","Error","mockImplementation","toHaveBeenCalledWith","msg"],"sourceRoot":"../../../src","sources":["contentpassTokenUtils/validateSubscription.test.ts"],"mappings":";;AAAA,OAA8B,KAAKA,2BAA2B,MAAM,4BAAyB;AAC7F,OAAO,KAAKC,uBAAuB,MAAM,yBAAsB;AAC/D,OAAOC,oBAAoB,MAAM,2BAAwB;AAEzD,MAAMC,yBAAmE,GAAG;EAC1EC,IAAI,EAAE;IACJC,GAAG,EAAE,UAAU;IACfC,IAAI,EAAE,IAAI;IACVC,GAAG,EAAE,UAAU;IACfC,GAAG,EAAE,UAAU;IACfC,IAAI,EAAE,IAAI;IACVC,KAAK,EAAE,CAAC,SAAS;EACnB,CAAC;EACDC,MAAM,EAAE;IACNC,GAAG,EAAE,OAAO;IACZC,GAAG,EAAE;EACP;AACF,CAAC;AAEDC,QAAQ,CAAC,sBAAsB,EAAE,MAAM;EACrC,IAAIC,wBAA0C;EAC9C,IAAIC,cAAgC;EAEpCC,UAAU,CAAC,MAAM;IACfF,wBAAwB,GAAGG,IAAI,CAC5BC,KAAK,CAACnB,2BAA2B,EAAE,SAAS,CAAC,CAC7CoB,eAAe,CAACjB,yBAAyB,CAAC;IAE7Ca,cAAc,GAAGE,IAAI,CAClBC,KAAK,CAAClB,uBAAuB,EAAE,aAAa,CAAC,CAC7CmB,eAAe,CAACC,SAAS,CAAC;EAC/B,CAAC,CAAC;EAEFC,SAAS,CAAC,MAAM;IACdJ,IAAI,CAACK,aAAa,CAAC,CAAC;IACpBL,IAAI,CAACM,eAAe,CAAC,CAAC;EACxB,CAAC,CAAC;EAEFC,EAAE,CAAC,0CAA0C,EAAE,MAAM;IACnDV,wBAAwB,CAACK,eAAe,CAACjB,yBAAyB,CAAC;IACnE,MAAMuB,MAAM,GAAGxB,oBAAoB,CAAC,2BAA2B,CAAC;IAEhEyB,MAAM,CAACD,MAAM,CAAC,CAACE,IAAI,CAAC,IAAI,CAAC;EAC3B,CAAC,CAAC;EAEFH,EAAE,CAAC,8DAA8D,EAAE,MAAM;IACvE,MAAMI,KAAK,GAAG,IAAIC,KAAK,CAAC,eAAe,CAAC;IACxCf,wBAAwB,CAACgB,kBAAkB,CAAC,MAAM;MAChD,MAAMF,KAAK;IACb,CAAC,CAAC;IACF,MAAMH,MAAM,GAAGxB,oBAAoB,CAAC,2BAA2B,CAAC;IAEhEyB,MAAM,CAACD,MAAM,CAAC,CAACE,IAAI,CAAC,KAAK,CAAC;IAC1BD,MAAM,CAACX,cAAc,CAAC,CAACgB,oBAAoB,CAACH,KAAK,EAAE;MACjDI,GAAG,EAAE;IACP,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFR,EAAE,CAAC,sDAAsD,EAAE,MAAM;IAC/DV,wBAAwB,CAACK,eAAe,CAAC;MACvC,GAAGjB,yBAAyB;MAC5BC,IAAI,EAAE;QACJ,GAAGD,yBAAyB,CAACC,IAAI;QACjCE,IAAI,EAAE;MACR;IACF,CAAC,CAAC;IACF,MAAMoB,MAAM,GAAGxB,oBAAoB,CAAC,2BAA2B,CAAC;IAEhEyB,MAAM,CAACD,MAAM,CAAC,CAACE,IAAI,CAAC,KAAK,CAAC;EAC5B,CAAC,CAAC;EAEFH,EAAE,CAAC,8CAA8C,EAAE,MAAM;IACvDV,wBAAwB,CAACK,eAAe,CAAC;MACvC,GAAGjB,yBAAyB;MAC5BC,IAAI,EAAE;QACJ,GAAGD,yBAAyB,CAACC,IAAI;QACjCM,KAAK,EAAE;MACT;IACF,CAAC,CAAC;IACF,MAAMgB,MAAM,GAAGxB,oBAAoB,CAAC,2BAA2B,CAAC;IAEhEyB,MAAM,CAACD,MAAM,CAAC,CAACE,IAAI,CAAC,KAAK,CAAC;EAC5B,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import sendPageViewEvent from "./sendPageViewEvent.js";
|
|
4
|
+
describe('sendPageViewEvent', () => {
|
|
5
|
+
const apiUrl = 'https://api.example.com';
|
|
6
|
+
const payload = {
|
|
7
|
+
propertyId: 'property123',
|
|
8
|
+
impressionId: 'impression456',
|
|
9
|
+
accessToken: 'token789'
|
|
10
|
+
};
|
|
11
|
+
afterEach(() => {
|
|
12
|
+
jest.resetAllMocks();
|
|
13
|
+
jest.restoreAllMocks();
|
|
14
|
+
});
|
|
15
|
+
it('should send a page view event successfully', async () => {
|
|
16
|
+
jest.spyOn(global, 'fetch').mockResolvedValue({
|
|
17
|
+
ok: true
|
|
18
|
+
});
|
|
19
|
+
const response = await sendPageViewEvent(apiUrl, payload);
|
|
20
|
+
expect(response.ok).toBe(true);
|
|
21
|
+
expect(global.fetch).toHaveBeenCalledWith(`${apiUrl}/pass/hit?pid=${payload.propertyId}&iid=${payload.impressionId}&t=pageview`, {
|
|
22
|
+
headers: {
|
|
23
|
+
Authorization: `Bearer ${payload.accessToken}`
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
it('should throw an error if the fetch fails', async () => {
|
|
28
|
+
jest.spyOn(global, 'fetch').mockResolvedValue({
|
|
29
|
+
ok: false
|
|
30
|
+
});
|
|
31
|
+
await expect(sendPageViewEvent(apiUrl, payload)).rejects.toThrow('Failed send page view event');
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
//# sourceMappingURL=sendPageViewEvent.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["sendPageViewEvent","describe","apiUrl","payload","propertyId","impressionId","accessToken","afterEach","jest","resetAllMocks","restoreAllMocks","it","spyOn","global","mockResolvedValue","ok","response","expect","toBe","fetch","toHaveBeenCalledWith","headers","Authorization","rejects","toThrow"],"sourceRoot":"../../../src","sources":["countImpressionUtils/sendPageViewEvent.test.ts"],"mappings":";;AAAA,OAAOA,iBAAiB,MAAM,wBAAqB;AAEnDC,QAAQ,CAAC,mBAAmB,EAAE,MAAM;EAClC,MAAMC,MAAM,GAAG,yBAAyB;EACxC,MAAMC,OAAO,GAAG;IACdC,UAAU,EAAE,aAAa;IACzBC,YAAY,EAAE,eAAe;IAC7BC,WAAW,EAAE;EACf,CAAC;EAEDC,SAAS,CAAC,MAAM;IACdC,IAAI,CAACC,aAAa,CAAC,CAAC;IACpBD,IAAI,CAACE,eAAe,CAAC,CAAC;EACxB,CAAC,CAAC;EAEFC,EAAE,CAAC,4CAA4C,EAAE,YAAY;IAC3DH,IAAI,CAACI,KAAK,CAACC,MAAM,EAAE,OAAO,CAAC,CAACC,iBAAiB,CAAC;MAC5CC,EAAE,EAAE;IACN,CAAQ,CAAC;IAET,MAAMC,QAAQ,GAAG,MAAMhB,iBAAiB,CAACE,MAAM,EAAEC,OAAO,CAAC;IAEzDc,MAAM,CAACD,QAAQ,CAACD,EAAE,CAAC,CAACG,IAAI,CAAC,IAAI,CAAC;IAC9BD,MAAM,CAACJ,MAAM,CAACM,KAAK,CAAC,CAACC,oBAAoB,CACvC,GAAGlB,MAAM,iBAAiBC,OAAO,CAACC,UAAU,QAAQD,OAAO,CAACE,YAAY,aAAa,EACrF;MACEgB,OAAO,EAAE;QACPC,aAAa,EAAE,UAAUnB,OAAO,CAACG,WAAW;MAC9C;IACF,CACF,CAAC;EACH,CAAC,CAAC;EAEFK,EAAE,CAAC,0CAA0C,EAAE,YAAY;IACzDH,IAAI,CAACI,KAAK,CAACC,MAAM,EAAE,OAAO,CAAC,CAACC,iBAAiB,CAAC;MAC5CC,EAAE,EAAE;IACN,CAAQ,CAAC;IAET,MAAME,MAAM,CAACjB,iBAAiB,CAACE,MAAM,EAAEC,OAAO,CAAC,CAAC,CAACoB,OAAO,CAACC,OAAO,CAC9D,6BACF,CAAC;EACH,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["sendStats","apiUrl","payload","response","fetch","method","headers","body","JSON","stringify","ok","Error","statusText"],"sourceRoot":"../../../src","sources":["countImpressionUtils/sendStats.ts"],"mappings":";;
|
|
1
|
+
{"version":3,"names":["sendStats","apiUrl","payload","response","fetch","method","headers","body","JSON","stringify","ok","Error","statusText"],"sourceRoot":"../../../src","sources":["countImpressionUtils/sendStats.ts"],"mappings":";;AASA,eAAe,eAAeA,SAASA,CAACC,MAAc,EAAEC,OAAqB,EAAE;EAC7E,MAAMC,QAAQ,GAAG,MAAMC,KAAK,CAAC,GAAGH,MAAM,SAAS,EAAE;IAC/CI,MAAM,EAAE,MAAM;IACdC,OAAO,EAAE;MACP,cAAc,EAAE;IAClB,CAAC;IACDC,IAAI,EAAEC,IAAI,CAACC,SAAS,CAACP,OAAO;EAC9B,CAAC,CAAC;EAEF,IAAI,CAACC,QAAQ,CAACO,EAAE,EAAE;IAChB,MAAM,IAAIC,KAAK,CAAC,iCAAiCR,QAAQ,CAACS,UAAU,EAAE,CAAC;EACzE;EAEA,OAAOT,QAAQ;AACjB","ignoreList":[]}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import sendStats from "./sendStats.js";
|
|
4
|
+
describe('sendStats', () => {
|
|
5
|
+
const apiUrl = 'https://api.example.com';
|
|
6
|
+
const payload = {
|
|
7
|
+
ea: 'eventAction',
|
|
8
|
+
ec: 'eventCategory',
|
|
9
|
+
cpabid: 'cpabid123',
|
|
10
|
+
cppid: 'cppid456',
|
|
11
|
+
cpsr: 1
|
|
12
|
+
};
|
|
13
|
+
afterEach(() => {
|
|
14
|
+
jest.resetAllMocks();
|
|
15
|
+
jest.restoreAllMocks();
|
|
16
|
+
});
|
|
17
|
+
it('should send stats successfully', async () => {
|
|
18
|
+
jest.spyOn(global, 'fetch').mockResolvedValue({
|
|
19
|
+
ok: true
|
|
20
|
+
});
|
|
21
|
+
const response = await sendStats(apiUrl, payload);
|
|
22
|
+
expect(response.ok).toBe(true);
|
|
23
|
+
expect(global.fetch).toHaveBeenCalledWith(`${apiUrl}/signal`, {
|
|
24
|
+
method: 'POST',
|
|
25
|
+
headers: {
|
|
26
|
+
'Content-Type': 'application/json; charset=UTF-8'
|
|
27
|
+
},
|
|
28
|
+
body: JSON.stringify(payload)
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
it('should throw an error if the fetch fails', async () => {
|
|
32
|
+
jest.spyOn(global, 'fetch').mockResolvedValue({
|
|
33
|
+
ok: false
|
|
34
|
+
});
|
|
35
|
+
await expect(sendStats(apiUrl, payload)).rejects.toThrow('Failed to send stats');
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
//# sourceMappingURL=sendStats.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["sendStats","describe","apiUrl","payload","ea","ec","cpabid","cppid","cpsr","afterEach","jest","resetAllMocks","restoreAllMocks","it","spyOn","global","mockResolvedValue","ok","response","expect","toBe","fetch","toHaveBeenCalledWith","method","headers","body","JSON","stringify","rejects","toThrow"],"sourceRoot":"../../../src","sources":["countImpressionUtils/sendStats.test.ts"],"mappings":";;AAAA,OAAOA,SAAS,MAAM,gBAAa;AAEnCC,QAAQ,CAAC,WAAW,EAAE,MAAM;EAC1B,MAAMC,MAAM,GAAG,yBAAyB;EACxC,MAAMC,OAAO,GAAG;IACdC,EAAE,EAAE,aAAa;IACjBC,EAAE,EAAE,eAAe;IACnBC,MAAM,EAAE,WAAW;IACnBC,KAAK,EAAE,UAAU;IACjBC,IAAI,EAAE;EACR,CAAC;EAEDC,SAAS,CAAC,MAAM;IACdC,IAAI,CAACC,aAAa,CAAC,CAAC;IACpBD,IAAI,CAACE,eAAe,CAAC,CAAC;EACxB,CAAC,CAAC;EAEFC,EAAE,CAAC,gCAAgC,EAAE,YAAY;IAC/CH,IAAI,CAACI,KAAK,CAACC,MAAM,EAAE,OAAO,CAAC,CAACC,iBAAiB,CAAC;MAC5CC,EAAE,EAAE;IACN,CAAQ,CAAC;IAET,MAAMC,QAAQ,GAAG,MAAMlB,SAAS,CAACE,MAAM,EAAEC,OAAO,CAAC;IAEjDgB,MAAM,CAACD,QAAQ,CAACD,EAAE,CAAC,CAACG,IAAI,CAAC,IAAI,CAAC;IAC9BD,MAAM,CAACJ,MAAM,CAACM,KAAK,CAAC,CAACC,oBAAoB,CAAC,GAAGpB,MAAM,SAAS,EAAE;MAC5DqB,MAAM,EAAE,MAAM;MACdC,OAAO,EAAE;QACP,cAAc,EAAE;MAClB,CAAC;MACDC,IAAI,EAAEC,IAAI,CAACC,SAAS,CAACxB,OAAO;IAC9B,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFU,EAAE,CAAC,0CAA0C,EAAE,YAAY;IACzDH,IAAI,CAACI,KAAK,CAACC,MAAM,EAAE,OAAO,CAAC,CAACC,iBAAiB,CAAC;MAC5CC,EAAE,EAAE;IACN,CAAQ,CAAC;IAET,MAAME,MAAM,CAACnB,SAAS,CAACE,MAAM,EAAEC,OAAO,CAAC,CAAC,CAACyB,OAAO,CAACC,OAAO,CACtD,sBACF,CAAC;EACH,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
|
package/lib/module/index.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
export {
|
|
3
|
+
import { ContentpassStateType } from "./types/ContentpassState.js";
|
|
4
|
+
const FOOBAR = 123;
|
|
5
|
+
export { FOOBAR };
|
|
6
|
+
import { ContentpassSdkProvider } from "./sdkContext/ContentpassSdkProvider.js";
|
|
7
|
+
import { default as useContentpassSdk } from "./sdkContext/useContentpassSdk.js";
|
|
8
|
+
export { ContentpassStateType, ContentpassSdkProvider, useContentpassSdk };
|
|
6
9
|
//# sourceMappingURL=index.js.map
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["ContentpassStateType","ContentpassSdkProvider","default","useContentpassSdk"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAQA,SAASA,oBAAoB,QAAQ,6BAA0B;
|
|
1
|
+
{"version":3,"names":["ContentpassStateType","FOOBAR","ContentpassSdkProvider","default","useContentpassSdk"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAQA,SAASA,oBAAoB,QAAQ,6BAA0B;AAK/D,MAAMC,MAAM,GAAG,GAAG;AAElB,SAASA,MAAM;AAOf,SAASC,sBAAsB,QAAQ,wCAAqC;AAE5E,SAASC,OAAO,IAAIC,iBAAiB,QAAQ,mCAAgC;AAE7E,SAASJ,oBAAoB,EAAEE,sBAAsB,EAAEE,iBAAiB","ignoreList":[]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import log, { enableLogger } from "./logger.js";
|
|
4
|
+
import { logger } from 'react-native-logs';
|
|
5
|
+
jest.mock('react-native-logs', () => {
|
|
6
|
+
return {
|
|
7
|
+
consoleTransport: jest.fn(),
|
|
8
|
+
logger: {
|
|
9
|
+
createLogger: jest.fn().mockReturnValue({
|
|
10
|
+
setSeverity: jest.fn(),
|
|
11
|
+
enable: jest.fn(),
|
|
12
|
+
debug: jest.fn()
|
|
13
|
+
})
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
});
|
|
17
|
+
describe('Logger', () => {
|
|
18
|
+
afterEach(() => {
|
|
19
|
+
jest.resetAllMocks();
|
|
20
|
+
jest.restoreAllMocks();
|
|
21
|
+
});
|
|
22
|
+
it('should create a disabled logger', () => {
|
|
23
|
+
expect(logger.createLogger).toHaveBeenCalledWith({
|
|
24
|
+
enabled: false,
|
|
25
|
+
transport: expect.any(Function),
|
|
26
|
+
transportOptions: expect.any(Object)
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
it('should enable the logger with the correct severity', () => {
|
|
30
|
+
const severity = 'info';
|
|
31
|
+
const setSeveritySpy = jest.spyOn(log, 'setSeverity');
|
|
32
|
+
const enableSpy = jest.spyOn(log, 'enable');
|
|
33
|
+
const debugSpy = jest.spyOn(log, 'debug');
|
|
34
|
+
enableLogger(severity);
|
|
35
|
+
expect(setSeveritySpy).toHaveBeenCalledWith(severity);
|
|
36
|
+
expect(enableSpy).toHaveBeenCalled();
|
|
37
|
+
expect(debugSpy).toHaveBeenCalledWith('Logger enabled with severity', severity);
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
//# sourceMappingURL=logger.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["log","enableLogger","logger","jest","mock","consoleTransport","fn","createLogger","mockReturnValue","setSeverity","enable","debug","describe","afterEach","resetAllMocks","restoreAllMocks","it","expect","toHaveBeenCalledWith","enabled","transport","any","Function","transportOptions","Object","severity","setSeveritySpy","spyOn","enableSpy","debugSpy","toHaveBeenCalled"],"sourceRoot":"../../src","sources":["logger.test.ts"],"mappings":";;AAAA,OAAOA,GAAG,IAAIC,YAAY,QAAQ,aAAU;AAE5C,SAASC,MAAM,QAAQ,mBAAmB;AAE1CC,IAAI,CAACC,IAAI,CAAC,mBAAmB,EAAE,MAAM;EACnC,OAAO;IACLC,gBAAgB,EAAEF,IAAI,CAACG,EAAE,CAAC,CAAC;IAC3BJ,MAAM,EAAE;MACNK,YAAY,EAAEJ,IAAI,CAACG,EAAE,CAAC,CAAC,CAACE,eAAe,CAAC;QACtCC,WAAW,EAAEN,IAAI,CAACG,EAAE,CAAC,CAAC;QACtBI,MAAM,EAAEP,IAAI,CAACG,EAAE,CAAC,CAAC;QACjBK,KAAK,EAAER,IAAI,CAACG,EAAE,CAAC;MACjB,CAAC;IACH;EACF,CAAC;AACH,CAAC,CAAC;AAEFM,QAAQ,CAAC,QAAQ,EAAE,MAAM;EACvBC,SAAS,CAAC,MAAM;IACdV,IAAI,CAACW,aAAa,CAAC,CAAC;IACpBX,IAAI,CAACY,eAAe,CAAC,CAAC;EACxB,CAAC,CAAC;EAEFC,EAAE,CAAC,iCAAiC,EAAE,MAAM;IAC1CC,MAAM,CAACf,MAAM,CAACK,YAAY,CAAC,CAACW,oBAAoB,CAAC;MAC/CC,OAAO,EAAE,KAAK;MACdC,SAAS,EAAEH,MAAM,CAACI,GAAG,CAACC,QAAQ,CAAC;MAC/BC,gBAAgB,EAAEN,MAAM,CAACI,GAAG,CAACG,MAAM;IACrC,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFR,EAAE,CAAC,oDAAoD,EAAE,MAAM;IAC7D,MAAMS,QAAkB,GAAG,MAAM;IACjC,MAAMC,cAAc,GAAGvB,IAAI,CAACwB,KAAK,CAAC3B,GAAG,EAAE,aAAa,CAAC;IACrD,MAAM4B,SAAS,GAAGzB,IAAI,CAACwB,KAAK,CAAC3B,GAAG,EAAE,QAAQ,CAAC;IAC3C,MAAM6B,QAAQ,GAAG1B,IAAI,CAACwB,KAAK,CAAC3B,GAAG,EAAE,OAAO,CAAC;IAEzCC,YAAY,CAACwB,QAAQ,CAAC;IAEtBR,MAAM,CAACS,cAAc,CAAC,CAACR,oBAAoB,CAACO,QAAQ,CAAC;IACrDR,MAAM,CAACW,SAAS,CAAC,CAACE,gBAAgB,CAAC,CAAC;IACpCb,MAAM,CAACY,QAAQ,CAAC,CAACX,oBAAoB,CACnC,8BAA8B,EAC9BO,QACF,CAAC;EACH,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"module"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { ContentpassSdkProvider } from "./ContentpassSdkProvider.js";
|
|
4
|
+
import { Text } from 'react-native';
|
|
5
|
+
import { render, screen } from '@testing-library/react-native';
|
|
6
|
+
import Contentpass from "../Contentpass.js";
|
|
7
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
8
|
+
jest.mock('../Contentpass');
|
|
9
|
+
describe('ContentpassSdkProvider', () => {
|
|
10
|
+
const mockConfig = {
|
|
11
|
+
issuer: 'https://my.contentpass.me',
|
|
12
|
+
propertyId: 'my-property-id',
|
|
13
|
+
planId: 'my-plan-id',
|
|
14
|
+
redirectUrl: 'de.contentpass.test://oauth',
|
|
15
|
+
apiUrl: 'https://cp.propert.com'
|
|
16
|
+
};
|
|
17
|
+
afterEach(() => {
|
|
18
|
+
jest.resetAllMocks();
|
|
19
|
+
});
|
|
20
|
+
it('initializes Contentpass SDK with the given configuration', () => {
|
|
21
|
+
render(/*#__PURE__*/_jsx(ContentpassSdkProvider, {
|
|
22
|
+
contentpassConfig: mockConfig,
|
|
23
|
+
children: /*#__PURE__*/_jsx(Text, {
|
|
24
|
+
testID: "child",
|
|
25
|
+
children: "Test Child"
|
|
26
|
+
})
|
|
27
|
+
}));
|
|
28
|
+
expect(Contentpass).toHaveBeenCalledWith(mockConfig);
|
|
29
|
+
expect(screen.getByTestId('child')).toHaveTextContent('Test Child');
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
//# sourceMappingURL=ContentpassSdkProvder.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["ContentpassSdkProvider","Text","render","screen","Contentpass","jsx","_jsx","jest","mock","describe","mockConfig","issuer","propertyId","planId","redirectUrl","apiUrl","afterEach","resetAllMocks","it","contentpassConfig","children","testID","expect","toHaveBeenCalledWith","getByTestId","toHaveTextContent"],"sourceRoot":"../../../src","sources":["sdkContext/ContentpassSdkProvder.test.tsx"],"mappings":";;AAAA,SAASA,sBAAsB,QAAQ,6BAA0B;AAEjE,SAASC,IAAI,QAAQ,cAAc;AACnC,SAASC,MAAM,EAAEC,MAAM,QAAQ,+BAA+B;AAC9D,OAAOC,WAAW,MAAM,mBAAgB;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAEzCC,IAAI,CAACC,IAAI,CAAC,gBAAgB,CAAC;AAE3BC,QAAQ,CAAC,wBAAwB,EAAE,MAAM;EACvC,MAAMC,UAA6B,GAAG;IACpCC,MAAM,EAAE,2BAA2B;IACnCC,UAAU,EAAE,gBAAgB;IAC5BC,MAAM,EAAE,YAAY;IACpBC,WAAW,EAAE,6BAA6B;IAC1CC,MAAM,EAAE;EACV,CAAC;EAEDC,SAAS,CAAC,MAAM;IACdT,IAAI,CAACU,aAAa,CAAC,CAAC;EACtB,CAAC,CAAC;EAEFC,EAAE,CAAC,0DAA0D,EAAE,MAAM;IACnEhB,MAAM,cACJI,IAAA,CAACN,sBAAsB;MAACmB,iBAAiB,EAAET,UAAW;MAAAU,QAAA,eACpDd,IAAA,CAACL,IAAI;QAACoB,MAAM,EAAC,OAAO;QAAAD,QAAA,EAAC;MAAU,CAAM;IAAC,CAChB,CAC1B,CAAC;IAEDE,MAAM,CAAClB,WAAW,CAAC,CAACmB,oBAAoB,CAACb,UAAU,CAAC;IACpDY,MAAM,CAACnB,MAAM,CAACqB,WAAW,CAAC,OAAO,CAAC,CAAC,CAACC,iBAAiB,CAAC,YAAY,CAAC;EACrE,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { renderHook } from '@testing-library/react-native';
|
|
5
|
+
import useContentpassSdk from "./useContentpassSdk.js";
|
|
6
|
+
import { contentpassSdkContext } from "./ContentpassSdkProvider.js";
|
|
7
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
8
|
+
describe('useContentpassSdk', () => {
|
|
9
|
+
afterEach(() => {
|
|
10
|
+
jest.resetAllMocks();
|
|
11
|
+
jest.restoreAllMocks();
|
|
12
|
+
});
|
|
13
|
+
it('should return the contentpassSdk from the context', () => {
|
|
14
|
+
const contentpassSdk = 'contentpassSdk';
|
|
15
|
+
const wrapper = ({
|
|
16
|
+
children
|
|
17
|
+
}) => /*#__PURE__*/_jsx(contentpassSdkContext.Provider, {
|
|
18
|
+
value: contentpassSdk,
|
|
19
|
+
children: children
|
|
20
|
+
});
|
|
21
|
+
const {
|
|
22
|
+
result
|
|
23
|
+
} = renderHook(() => useContentpassSdk(), {
|
|
24
|
+
wrapper
|
|
25
|
+
});
|
|
26
|
+
expect(result.current).toBe(contentpassSdk);
|
|
27
|
+
});
|
|
28
|
+
it('should throw an error if used outside of a ContentpassSdkProvider', async () => {
|
|
29
|
+
// mock console.error to prevent error output in test
|
|
30
|
+
jest.spyOn(console, 'error').mockImplementation(() => {});
|
|
31
|
+
expect(() => {
|
|
32
|
+
renderHook(() => useContentpassSdk());
|
|
33
|
+
}).toThrow('useContentpassSdk must be used within a ContentpassSdkProvider');
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
//# sourceMappingURL=useContentpassSdk.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","renderHook","useContentpassSdk","contentpassSdkContext","jsx","_jsx","describe","afterEach","jest","resetAllMocks","restoreAllMocks","it","contentpassSdk","wrapper","children","Provider","value","result","expect","current","toBe","spyOn","console","mockImplementation","toThrow"],"sourceRoot":"../../../src","sources":["sdkContext/useContentpassSdk.test.tsx"],"mappings":";;AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,UAAU,QAAQ,+BAA+B;AAC1D,OAAOC,iBAAiB,MAAM,wBAAqB;AACnD,SAASC,qBAAqB,QAAQ,6BAA0B;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAGjEC,QAAQ,CAAC,mBAAmB,EAAE,MAAM;EAClCC,SAAS,CAAC,MAAM;IACdC,IAAI,CAACC,aAAa,CAAC,CAAC;IACpBD,IAAI,CAACE,eAAe,CAAC,CAAC;EACxB,CAAC,CAAC;EAEFC,EAAE,CAAC,mDAAmD,EAAE,MAAM;IAC5D,MAAMC,cAAc,GAAG,gBAAgB;IACvC,MAAMC,OAAO,GAAGA,CAAC;MAAEC;IAAwC,CAAC,kBAC1DT,IAAA,CAACF,qBAAqB,CAACY,QAAQ;MAC7BC,KAAK,EAAEJ,cAAqC;MAAAE,QAAA,EAE3CA;IAAQ,CACqB,CACjC;IAED,MAAM;MAAEG;IAAO,CAAC,GAAGhB,UAAU,CAAC,MAAMC,iBAAiB,CAAC,CAAC,EAAE;MAAEW;IAAQ,CAAC,CAAC;IAErEK,MAAM,CAACD,MAAM,CAACE,OAAO,CAAC,CAACC,IAAI,CAACR,cAAc,CAAC;EAC7C,CAAC,CAAC;EAEFD,EAAE,CAAC,mEAAmE,EAAE,YAAY;IAClF;IACAH,IAAI,CAACa,KAAK,CAACC,OAAO,EAAE,OAAO,CAAC,CAACC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;IAEzDL,MAAM,CAAC,MAAM;MACXjB,UAAU,CAAC,MAAMC,iBAAiB,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAACsB,OAAO,CACR,gEACF,CAAC;EACH,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { useEffect, useState } from 'react';
|
|
4
|
+
import useContentpassSdk from "./useContentpassSdk.js";
|
|
5
|
+
import { ContentpassStateType } from "../types/ContentpassState.js";
|
|
6
|
+
const useContentpassState = () => {
|
|
7
|
+
const sdk = useContentpassSdk();
|
|
8
|
+
const [state, setState] = useState({
|
|
9
|
+
state: ContentpassStateType.INITIALISING
|
|
10
|
+
});
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
const observer = nextState => setState(nextState);
|
|
13
|
+
sdk.registerObserver(observer);
|
|
14
|
+
return () => {
|
|
15
|
+
sdk.unregisterObserver(observer);
|
|
16
|
+
};
|
|
17
|
+
}, [sdk]);
|
|
18
|
+
return state;
|
|
19
|
+
};
|
|
20
|
+
export default useContentpassState;
|
|
21
|
+
//# sourceMappingURL=useContentpassState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useEffect","useState","useContentpassSdk","ContentpassStateType","useContentpassState","sdk","state","setState","INITIALISING","observer","nextState","registerObserver","unregisterObserver"],"sourceRoot":"../../../src","sources":["sdkContext/useContentpassState.ts"],"mappings":";;AAAA,SAASA,SAAS,EAAEC,QAAQ,QAAQ,OAAO;AAC3C,OAAOC,iBAAiB,MAAM,wBAAqB;AACnD,SAEEC,oBAAoB,QACf,8BAA2B;AAElC,MAAMC,mBAAmB,GAAGA,CAAA,KAAM;EAChC,MAAMC,GAAG,GAAGH,iBAAiB,CAAC,CAAC;EAC/B,MAAM,CAACI,KAAK,EAAEC,QAAQ,CAAC,GAAGN,QAAQ,CAAmB;IACnDK,KAAK,EAAEH,oBAAoB,CAACK;EAC9B,CAAC,CAAC;EAEFR,SAAS,CAAC,MAAM;IACd,MAAMS,QAAQ,GAAIC,SAA2B,IAAKH,QAAQ,CAACG,SAAS,CAAC;IACrEL,GAAG,CAACM,gBAAgB,CAACF,QAAQ,CAAC;IAE9B,OAAO,MAAM;MACXJ,GAAG,CAACO,kBAAkB,CAACH,QAAQ,CAAC;IAClC,CAAC;EACH,CAAC,EAAE,CAACJ,GAAG,CAAC,CAAC;EAET,OAAOC,KAAK;AACd,CAAC;AAED,eAAeF,mBAAmB","ignoreList":[]}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { defaultStackParser, makeFetchTransport } from '@sentry/react';
|
|
4
|
+
import * as SentryReactNativeModule from '@sentry/react-native';
|
|
5
|
+
import { __internal_reset_sentry_scope, initSentry, reportError } from "./sentryIntegration.js";
|
|
6
|
+
import logger from "./logger.js";
|
|
7
|
+
jest.mock('react-native', () => {
|
|
8
|
+
return {
|
|
9
|
+
Platform: {
|
|
10
|
+
OS: 'android',
|
|
11
|
+
Version: '10.1.2'
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
});
|
|
15
|
+
describe('sentryIntegration', () => {
|
|
16
|
+
let addBreadcrumbMock;
|
|
17
|
+
let captureExceptionMock;
|
|
18
|
+
let setTagsMock;
|
|
19
|
+
let ReactNativeClientSpy;
|
|
20
|
+
let ScopeSpy;
|
|
21
|
+
beforeEach(() => {
|
|
22
|
+
addBreadcrumbMock = jest.fn();
|
|
23
|
+
captureExceptionMock = jest.fn();
|
|
24
|
+
setTagsMock = jest.fn();
|
|
25
|
+
ScopeSpy = jest.spyOn(SentryReactNativeModule, 'Scope').mockReturnValue({
|
|
26
|
+
setClient: jest.fn(),
|
|
27
|
+
init: jest.fn(),
|
|
28
|
+
addBreadcrumb: addBreadcrumbMock,
|
|
29
|
+
captureException: captureExceptionMock,
|
|
30
|
+
setTags: setTagsMock
|
|
31
|
+
});
|
|
32
|
+
ReactNativeClientSpy = jest.spyOn(SentryReactNativeModule, 'ReactNativeClient').mockImplementation(() => ({
|
|
33
|
+
init: jest.fn()
|
|
34
|
+
}));
|
|
35
|
+
jest.spyOn(logger, 'error').mockImplementation(() => {});
|
|
36
|
+
jest.spyOn(logger, 'warn').mockImplementation(() => {});
|
|
37
|
+
});
|
|
38
|
+
afterEach(() => {
|
|
39
|
+
jest.restoreAllMocks();
|
|
40
|
+
jest.resetAllMocks();
|
|
41
|
+
__internal_reset_sentry_scope();
|
|
42
|
+
});
|
|
43
|
+
it('should not initialise sentry scope if already initialised', () => {
|
|
44
|
+
initSentry({
|
|
45
|
+
propertyId: 'test-id'
|
|
46
|
+
});
|
|
47
|
+
initSentry({
|
|
48
|
+
propertyId: 'test-id'
|
|
49
|
+
});
|
|
50
|
+
expect(logger.warn).toHaveBeenCalledWith('Sentry already initialized');
|
|
51
|
+
expect(ReactNativeClientSpy).toHaveBeenCalledTimes(1);
|
|
52
|
+
expect(ScopeSpy).toHaveBeenCalledTimes(1);
|
|
53
|
+
});
|
|
54
|
+
it('should initialise sentry scope with correct options', () => {
|
|
55
|
+
initSentry({
|
|
56
|
+
propertyId: 'test-id'
|
|
57
|
+
});
|
|
58
|
+
expect(ReactNativeClientSpy).toHaveBeenCalledWith({
|
|
59
|
+
attachStacktrace: true,
|
|
60
|
+
autoInitializeNativeSdk: false,
|
|
61
|
+
dsn: 'https://74ab84b55b30a3800255a25eac4d089c@sentry.tools.contentpass.dev/8',
|
|
62
|
+
enableAppStartTracking: false,
|
|
63
|
+
enableAutoPerformanceTracing: false,
|
|
64
|
+
enableCaptureFailedRequests: false,
|
|
65
|
+
enableNative: false,
|
|
66
|
+
enableNativeCrashHandling: false,
|
|
67
|
+
enableNativeFramesTracking: false,
|
|
68
|
+
enableNativeNagger: false,
|
|
69
|
+
enableNdk: false,
|
|
70
|
+
enableStallTracking: true,
|
|
71
|
+
enableUserInteractionTracing: false,
|
|
72
|
+
enableWatchdogTerminationTracking: false,
|
|
73
|
+
environment: 'development',
|
|
74
|
+
maxQueueSize: 30,
|
|
75
|
+
parentSpanIsAlwaysRootSpan: true,
|
|
76
|
+
patchGlobalPromise: true,
|
|
77
|
+
sendClientReports: true,
|
|
78
|
+
integrations: undefined,
|
|
79
|
+
stackParser: defaultStackParser,
|
|
80
|
+
transport: makeFetchTransport
|
|
81
|
+
});
|
|
82
|
+
expect(setTagsMock).toHaveBeenCalledWith({
|
|
83
|
+
OS: 'android',
|
|
84
|
+
platformVersion: '10.1.2',
|
|
85
|
+
propertyId: 'test-id'
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
describe('reportError', () => {
|
|
89
|
+
it('should add breadcrumb with message if provided', () => {
|
|
90
|
+
initSentry({
|
|
91
|
+
propertyId: 'test-id'
|
|
92
|
+
});
|
|
93
|
+
const err = new Error('test');
|
|
94
|
+
const msg = 'test message';
|
|
95
|
+
reportError(err, {
|
|
96
|
+
msg
|
|
97
|
+
});
|
|
98
|
+
expect(addBreadcrumbMock).toHaveBeenCalledWith({
|
|
99
|
+
category: 'Error',
|
|
100
|
+
message: msg,
|
|
101
|
+
level: 'log'
|
|
102
|
+
});
|
|
103
|
+
expect(captureExceptionMock).toHaveBeenCalledWith(err);
|
|
104
|
+
});
|
|
105
|
+
it('should not add breadcrumb if message is not provided', () => {
|
|
106
|
+
initSentry({
|
|
107
|
+
propertyId: 'test-id'
|
|
108
|
+
});
|
|
109
|
+
const err = new Error('test');
|
|
110
|
+
reportError(err);
|
|
111
|
+
expect(addBreadcrumbMock).not.toHaveBeenCalled();
|
|
112
|
+
expect(captureExceptionMock).toHaveBeenCalledWith(err);
|
|
113
|
+
});
|
|
114
|
+
it('should not throw error when reportError is called before initSentry', () => {
|
|
115
|
+
const err = new Error('test');
|
|
116
|
+
const msg = 'test message';
|
|
117
|
+
reportError(err, {
|
|
118
|
+
msg
|
|
119
|
+
});
|
|
120
|
+
expect(logger.error).toHaveBeenCalledWith({
|
|
121
|
+
err
|
|
122
|
+
}, msg);
|
|
123
|
+
expect(addBreadcrumbMock).not.toHaveBeenCalled();
|
|
124
|
+
expect(captureExceptionMock).not.toHaveBeenCalledWith(err);
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
//# sourceMappingURL=sentryIntegration.test.js.map
|