66 TrackEventData ,
77} from "../../src/index.ts" ;
88import { getSharedInstance } from "../../src/utils/sharedInstance.ts" ;
9+ import { User } from "../../src/modules/auth.types.ts" ;
10+ import { AxiosInstance } from "axios" ;
911
1012describe ( "Analytics Module" , ( ) => {
1113 let base44 : ReturnType < typeof createClient > ;
@@ -19,26 +21,45 @@ describe("Analytics Module", () => {
1921 const serverUrl = "https://api.base44.com" ;
2022
2123 beforeEach ( ( ) => {
22- base44 = createClient ( {
23- serverUrl,
24- appId,
25- } ) ;
24+ vi . mock ( "../../src/utils/axios-client.ts" , ( ) => ( {
25+ createAxiosClient : vi . fn ( ) . mockImplementation (
26+ ( ) =>
27+ ( {
28+ request : vi . fn ( ) . mockResolvedValue ( {
29+ status : 200 ,
30+ data : {
31+ message : "success" ,
32+ } ,
33+ } ) ,
34+ } as unknown as AxiosInstance )
35+ ) ,
36+ } ) ) ;
2637 sharedState = getSharedInstance ( "analytics" , ( ) => ( {
2738 requestsQueue : [ ] ,
2839 isProcessing : false ,
29- sessionContext : {
30- user_id : "test-user-id" ,
31- } ,
32- config : {
33- enabled : true ,
34- maxQueueSize : 1000 ,
35- throttleTime : 1000 ,
36- batchSize : 30 ,
37- } ,
40+ sessionContext : { } ,
41+ config : { } ,
3842 } ) ) ;
43+ sharedState . isProcessing = false ;
44+ sharedState . requestsQueue = [ ] ;
45+ sharedState . sessionContext = {
46+ user_id : "test-user-id" ,
47+ } ;
48+ sharedState . config = {
49+ enabled : true ,
50+ maxQueueSize : 1000 ,
51+ throttleTime : 1000 ,
52+ batchSize : 2 ,
53+ } ;
54+
55+ base44 = createClient ( {
56+ serverUrl,
57+ appId,
58+ } ) ;
3959 } ) ;
4060
4161 afterEach ( ( ) => {
62+ vi . clearAllMocks ( ) ;
4263 base44 . cleanup ( ) ;
4364 sharedState = null ;
4465 } ) ;
@@ -47,17 +68,38 @@ describe("Analytics Module", () => {
4768 expect ( base44 . analytics ) . toBeDefined ( ) ;
4869 expect ( sharedState ) . toBeDefined ( ) ;
4970 expect ( sharedState ?. requestsQueue ) . toBeDefined ( ) ;
50- expect ( sharedState ?. isProcessing ) . toBe ( true ) ;
71+ expect ( sharedState ?. isProcessing ) . toBe ( false ) ;
5172 } ) ;
5273
5374 test ( "should track an event" , ( ) => {
54- vi . spyOn ( base44 . analytics , "track" ) . mockImplementation ( ( ) => {
55- console . log ( "track called" ) ;
56- } ) ;
75+ vi . spyOn ( base44 . analytics , "track" ) ;
5776
5877 base44 . analytics . track ( { eventName : "test-event" } ) ;
78+ expect ( sharedState ?. isProcessing ) . toBe ( true ) ;
5979 expect ( base44 . analytics . track ) . toHaveBeenCalledWith ( {
6080 eventName : "test-event" ,
6181 } ) ;
6282 } ) ;
83+
84+ test ( "should track multiple events" , async ( ) => {
85+ vi . useFakeTimers ( ) ;
86+
87+ for ( let i = 0 ; i < 5 ; i ++ ) {
88+ base44 . analytics . track ( { eventName : `test-event ${ i } ` } ) ;
89+ }
90+
91+ expect ( sharedState ?. isProcessing ) . toBe ( true ) ;
92+ expect ( sharedState ?. requestsQueue . length ) . toBe ( 4 ) ;
93+ await vi . advanceTimersByTimeAsync ( 1000 ) ;
94+ expect ( sharedState ?. requestsQueue . length ) . toBe ( 2 ) ;
95+ // add another event while processing to mix things up
96+ base44 . analytics . track ( { eventName : `test-event 5` } ) ;
97+
98+ await vi . advanceTimersByTimeAsync ( 1000 ) ;
99+ expect ( sharedState ?. requestsQueue . length ) . toBe ( 1 ) ;
100+ await vi . advanceTimersByTimeAsync ( 1000 ) ;
101+ expect ( sharedState ?. requestsQueue . length ) . toBe ( 0 ) ;
102+ await vi . advanceTimersByTimeAsync ( 1000 ) ;
103+ expect ( sharedState ?. isProcessing ) . toBe ( false ) ;
104+ } ) ;
63105} ) ;
0 commit comments