Skip to content

Commit 7bbb9ef

Browse files
zhu-xiaoweixiaoweii
andauthored
feat: add hash code to request query parameter (#25)
Co-authored-by: xiaoweii <xiaoweii@amazom.com>
1 parent dbfe25a commit 7bbb9ef

14 files changed

+52
-37
lines changed

src/network/NetRequest.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
*/
1313
import { ConsoleLogger as Logger } from '@aws-amplify/core';
1414
import { ClickstreamContext } from '../provider';
15+
import { HashUtil } from '../util/HashUtil';
1516

1617
const logger = new Logger('NetRequest');
1718

@@ -30,10 +31,12 @@ export class NetRequest {
3031
timeout = NetRequest.REQUEST_TIMEOUT
3132
): Promise<boolean> {
3233
const { configuration, browserInfo } = context;
34+
const eventsHash = await HashUtil.getHashCode(eventsJson);
3335
const queryParams = new URLSearchParams({
3436
platform: 'Web',
3537
appId: configuration.appId,
3638
event_bundle_sequence_id: bundleSequenceId.toString(),
39+
hashCode: eventsHash,
3740
});
3841
const url = `${configuration.endpoint}?${queryParams.toString()}`;
3942

src/provider/AnalyticsEventBuilder.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,6 @@ export class AnalyticsEventBuilder {
6060

6161
const items = this.getEventItemsWithCheck(event.items, attributes);
6262
return {
63-
hashCode: '',
6463
event_type: event.name,
6564
event_id: uuidV4(),
6665
device_id: StorageUtil.getDeviceId(),

src/provider/ClickstreamProvider.ts

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ import {
3333
SendMode,
3434
UserAttribute,
3535
} from '../types';
36-
import { HashUtil } from '../util/HashUtil';
3736
import { StorageUtil } from '../util/StorageUtil';
3837

3938
const logger = new Logger('ClickstreamProvider');
@@ -140,14 +139,7 @@ export class ClickstreamProvider implements AnalyticsProvider {
140139
}
141140

142141
recordEvent(event: AnalyticsEvent, isImmediate = false) {
143-
HashUtil.getHashCode(JSON.stringify(event))
144-
.then(hashCode => {
145-
event.hashCode = hashCode;
146-
this.eventRecorder.record(event, isImmediate);
147-
})
148-
.catch(error => {
149-
logger.error(`Create hash code failed with ${error}`);
150-
});
142+
this.eventRecorder.record(event, isImmediate);
151143
}
152144

153145
setUserId(userId: string | null) {

src/provider/Event.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ export class Event {
8585
static readonly Constants = {
8686
PREFIX: '[',
8787
SUFFIX: ']',
88-
LAST_EVENT_IDENTIFIER: '},{"hashCode":',
88+
LAST_EVENT_IDENTIFIER: '},{"event_type":',
8989
KEYWORDS: ['q', 's', 'search', 'query', 'keyword'],
9090
};
9191
}

src/types/Analytics.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,6 @@ export interface ClickstreamEvent {
8080
}
8181

8282
export interface AnalyticsEvent {
83-
hashCode?: string;
8483
unique_id: string;
8584
event_type: string;
8685
event_id: string;

test/ClickstreamAnalytics.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,18 @@ import { Event } from '../src/provider';
1717
import { StorageUtil } from '../src/util/StorageUtil';
1818

1919
describe('ClickstreamAnalytics test', () => {
20-
const mockSendRequestSuccess = jest.fn().mockResolvedValue(true);
21-
2220
beforeEach(() => {
2321
localStorage.clear();
22+
const mockSendRequestSuccess = jest.fn().mockResolvedValue(true);
2423
jest
2524
.spyOn(NetRequest, 'sendRequest')
2625
.mockImplementation(mockSendRequestSuccess);
2726
});
2827

2928
afterEach(() => {
3029
ClickstreamAnalytics['provider'] = undefined;
31-
jest.resetAllMocks();
30+
jest.restoreAllMocks();
31+
jest.clearAllMocks();
3232
});
3333

3434
test('test init sdk', () => {

test/network/NetRequest.test.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { BrowserInfo } from '../../src/browser';
1616
import { NetRequest } from '../../src/network/NetRequest';
1717
import { AnalyticsEventBuilder, ClickstreamContext } from '../../src/provider';
1818
import { Session } from '../../src/tracker';
19+
import { HashUtil } from '../../src/util/HashUtil';
1920

2021
describe('ClickstreamAnalytics test', () => {
2122
let context: ClickstreamContext;
@@ -85,4 +86,22 @@ describe('ClickstreamAnalytics test', () => {
8586
const result = await NetRequest.sendRequest(eventJson, context, 1, 1, 200);
8687
expect(result).toBeFalsy();
8788
});
89+
90+
test('test request success with hash code', async () => {
91+
fetchMock.post('begin:https://localhost:8080/collect', {
92+
status: 200,
93+
body: [],
94+
});
95+
const mockFetch = jest.spyOn(global, 'fetch');
96+
97+
const eventJsonHashCode = await HashUtil.getHashCode(eventJson);
98+
const result = await NetRequest.sendRequest(eventJson, context, 1);
99+
expect(result).toBeTruthy();
100+
101+
const [requestUrl] = mockFetch.mock.calls[0];
102+
const requestHashCode = new URL(requestUrl.toString()).searchParams.get(
103+
'hashCode'
104+
);
105+
expect(eventJsonHashCode).toBe(requestHashCode);
106+
});
88107
});

test/provider/AnalyticsEventBuilder.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ describe('AnalyticsEventBuilder test', () => {
4646
{},
4747
Session.getCurrentSession(context)
4848
);
49-
expect(event.hashCode.length).toBe(0);
49+
expect((event as any).hashCode).toBeUndefined();
5050
expect(event.event_type).toBe('testEvent');
5151
expect(event.event_id.length > 0).toBeTruthy();
5252
expect(event.device_id.length > 0).toBeTruthy();

test/provider/BatchModeTimer.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,16 @@
1010
* OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions
1111
* and limitations under the License.
1212
*/
13+
import { SendMode } from '../../src';
1314
import { NetRequest } from '../../src/network/NetRequest';
1415
import { ClickstreamProvider } from '../../src/provider';
15-
import { SendMode } from '../../src/types';
1616

1717
describe('ClickstreamProvider timer test', () => {
1818
let provider: ClickstreamProvider;
19-
const mockSendRequest = jest.fn().mockResolvedValue(true);
2019
beforeEach(() => {
2120
localStorage.clear();
2221
provider = new ClickstreamProvider();
22+
const mockSendRequest = jest.fn().mockResolvedValue(true);
2323
jest.spyOn(NetRequest, 'sendRequest').mockImplementation(mockSendRequest);
2424
});
2525

test/provider/ClickstreamProvider.test.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,11 @@ describe('ClickstreamProvider test', () => {
2929
let mockProviderCreateEvent: any;
3030
let mockCreateEvent: any;
3131
let mockRecordProfileSet: any;
32-
const mockSendRequest = jest.fn().mockResolvedValue(true);
33-
beforeEach(() => {
32+
33+
beforeEach(async () => {
3434
localStorage.clear();
35+
const mockSendRequest = jest.fn().mockResolvedValue(true);
36+
jest.spyOn(NetRequest, 'sendRequest').mockImplementation(mockSendRequest);
3537
provider = new ClickstreamProvider();
3638
provider.configure({
3739
appId: 'testAppId',
@@ -40,7 +42,6 @@ describe('ClickstreamProvider test', () => {
4042
mockProviderCreateEvent = jest.spyOn(provider, 'createEvent');
4143
mockCreateEvent = jest.spyOn(AnalyticsEventBuilder, 'createEvent');
4244
mockRecordProfileSet = jest.spyOn(provider, 'recordProfileSet');
43-
jest.spyOn(NetRequest, 'sendRequest').mockImplementation(mockSendRequest);
4445
});
4546

4647
afterEach(() => {
@@ -49,7 +50,8 @@ describe('ClickstreamProvider test', () => {
4950
jest.clearAllMocks();
5051
});
5152

52-
test('test default value', () => {
53+
test('test default value', async () => {
54+
await sleep(100);
5355
expect(provider.configuration.appId).toBe('testAppId');
5456
expect(provider.configuration.endpoint).toBe('https://example.com/collect');
5557
expect(provider.configuration.sendMode).toBe(SendMode.Immediate);
@@ -296,4 +298,8 @@ describe('ClickstreamProvider test', () => {
296298
});
297299
expect(provider.globalAttributes['_channel']).toBeUndefined();
298300
});
301+
302+
function sleep(ms: number): Promise<void> {
303+
return new Promise(resolve => setTimeout(resolve, ms));
304+
}
299305
});

0 commit comments

Comments
 (0)