@@ -542,6 +542,104 @@ test("cookie-names", async ({ browser }) => {
542
542
expect ( requestLog [ 1 ] . body . anonymousId ) . toEqual ( anonymousId ) ;
543
543
} ) ;
544
544
545
+ test ( "spa-navigation" , async ( { browser } ) => {
546
+ clearRequestLog ( ) ;
547
+ const browserContext = await browser . newContext ( ) ;
548
+ const { page, uncaughtErrors } = await createLoggingPage ( browserContext ) ;
549
+
550
+ const initialUrl = `${ server . baseUrl } /spa-navigation.html` ;
551
+ const pageResult = await page . goto ( initialUrl ) ;
552
+
553
+ await page . waitForFunction ( ( ) => window [ "jitsu" ] !== undefined , undefined , {
554
+ timeout : 1000 ,
555
+ polling : 100 ,
556
+ } ) ;
557
+
558
+ expect ( pageResult . status ( ) ) . toBe ( 200 ) ;
559
+
560
+ await page . waitForFunction ( ( ) => window [ "__spaTestComplete" ] === true , undefined , {
561
+ timeout : 2000 ,
562
+ polling : 100 ,
563
+ } ) ;
564
+
565
+ await new Promise ( resolve => setTimeout ( resolve , 500 ) ) ;
566
+
567
+ expect ( uncaughtErrors . length ) . toEqual ( 0 ) ;
568
+
569
+ console . log (
570
+ `📝 Request log size of ${ requestLog . length } ` ,
571
+ requestLog . map ( x => describeEvent ( x . type , x . body ) )
572
+ ) ;
573
+
574
+ const pageEvents = requestLog . filter ( x => x . type === "page" ) ;
575
+ const trackEvents = requestLog . filter ( x => x . type === "track" ) ;
576
+
577
+ expect ( pageEvents . length ) . toBe ( 6 ) ;
578
+ expect ( trackEvents . length ) . toBe ( 6 ) ;
579
+
580
+ //expect(pageEvents[0].body.name).toBe("initial-page");
581
+ expect ( pageEvents [ 0 ] . body . properties . path ) . toBe ( "/spa-navigation.html" ) ;
582
+ expect ( pageEvents [ 0 ] . body . properties . url ) . toContain ( "/spa-navigation.html" ) ;
583
+ expect ( pageEvents [ 0 ] . body . context . page . path ) . toBe ( "/spa-navigation.html" ) ;
584
+ expect ( pageEvents [ 0 ] . body . context . page . url ) . toContain ( "/spa-navigation.html" ) ;
585
+
586
+ expect ( pageEvents [ 1 ] . body . properties . path ) . toBe ( "/page1" ) ;
587
+ expect ( pageEvents [ 1 ] . body . properties . url ) . toContain ( "/page1" ) ;
588
+ expect ( pageEvents [ 1 ] . body . properties . search ) . toBe ( "" ) ;
589
+ expect ( pageEvents [ 1 ] . body . properties . hash ) . toBe ( "" ) ;
590
+ expect ( pageEvents [ 1 ] . body . context . page . path ) . toBe ( "/page1" ) ;
591
+ expect ( pageEvents [ 1 ] . body . context . page . url ) . toContain ( "/page1" ) ;
592
+ expect ( pageEvents [ 1 ] . body . context . page . search ) . toBe ( "" ) ;
593
+
594
+ expect ( pageEvents [ 2 ] . body . properties . path ) . toBe ( "/page2" ) ;
595
+ expect ( pageEvents [ 2 ] . body . properties . url ) . toContain ( "/page2?param1=value1" ) ;
596
+ expect ( pageEvents [ 2 ] . body . properties . search ) . toBe ( "?param1=value1" ) ;
597
+ expect ( pageEvents [ 2 ] . body . properties . hash ) . toBe ( "" ) ;
598
+ expect ( pageEvents [ 2 ] . body . context . page . path ) . toBe ( "/page2" ) ;
599
+ expect ( pageEvents [ 2 ] . body . context . page . url ) . toContain ( "/page2?param1=value1" ) ;
600
+ expect ( pageEvents [ 2 ] . body . context . page . search ) . toBe ( "?param1=value1" ) ;
601
+
602
+ expect ( pageEvents [ 3 ] . body . properties . path ) . toBe ( "/page3" ) ;
603
+ expect ( pageEvents [ 3 ] . body . properties . url ) . toContain ( "/page3?param1=value1¶m2=value2" ) ;
604
+ expect ( pageEvents [ 3 ] . body . properties . search ) . toBe ( "?param1=value1¶m2=value2" ) ;
605
+ expect ( pageEvents [ 3 ] . body . properties . hash ) . toBe ( "#section1" ) ;
606
+ expect ( pageEvents [ 3 ] . body . context . page . path ) . toBe ( "/page3" ) ;
607
+ expect ( pageEvents [ 3 ] . body . context . page . url ) . toContain ( "/page3?param1=value1¶m2=value2" ) ;
608
+ expect ( pageEvents [ 3 ] . body . context . page . search ) . toBe ( "?param1=value1¶m2=value2" ) ;
609
+
610
+ expect ( pageEvents [ 4 ] . body . properties . path ) . toBe ( "/page4/subpage" ) ;
611
+ expect ( pageEvents [ 4 ] . body . properties . url ) . toContain ( "/page4/subpage" ) ;
612
+ expect ( pageEvents [ 4 ] . body . properties . search ) . toBe ( "" ) ;
613
+ expect ( pageEvents [ 4 ] . body . properties . hash ) . toBe ( "#section2" ) ;
614
+ expect ( pageEvents [ 4 ] . body . context . page . path ) . toBe ( "/page4/subpage" ) ;
615
+ expect ( pageEvents [ 4 ] . body . context . page . url ) . toContain ( "/page4/subpage" ) ;
616
+ expect ( pageEvents [ 4 ] . body . context . page . search ) . toBe ( "" ) ;
617
+
618
+ expect ( pageEvents [ 5 ] . body . properties . path ) . toBe ( "/final" ) ;
619
+ expect ( pageEvents [ 5 ] . body . properties . url ) . toContain ( "/final?utm_source=test&utm_medium=spa" ) ;
620
+ expect ( pageEvents [ 5 ] . body . properties . search ) . toBe ( "?utm_source=test&utm_medium=spa" ) ;
621
+ expect ( pageEvents [ 5 ] . body . properties . hash ) . toBe ( "#top" ) ;
622
+ expect ( pageEvents [ 5 ] . body . context . page . path ) . toBe ( "/final" ) ;
623
+ expect ( pageEvents [ 5 ] . body . context . page . url ) . toContain ( "/final?utm_source=test&utm_medium=spa" ) ;
624
+ expect ( pageEvents [ 5 ] . body . context . page . search ) . toBe ( "?utm_source=test&utm_medium=spa" ) ;
625
+
626
+ const navTrackEvents = trackEvents . filter ( x => x . body . event === "navigation" ) ;
627
+ expect ( navTrackEvents . length ) . toBe ( 5 ) ;
628
+
629
+ expect ( navTrackEvents [ 0 ] . body . context . page . path ) . toBe ( "/page1" ) ;
630
+ expect ( navTrackEvents [ 1 ] . body . context . page . url ) . toContain ( "/page2?param1=value1" ) ;
631
+ expect ( navTrackEvents [ 1 ] . body . context . page . path ) . toBe ( "/page2" ) ;
632
+ expect ( navTrackEvents [ 1 ] . body . context . page . search ) . toBe ( "?param1=value1" ) ;
633
+ expect ( navTrackEvents [ 2 ] . body . context . page . url ) . toContain ( "/page3?param1=value1¶m2=value2#section1" ) ;
634
+ expect ( navTrackEvents [ 2 ] . body . context . page . path ) . toBe ( "/page3" ) ;
635
+ expect ( navTrackEvents [ 2 ] . body . context . page . search ) . toBe ( "?param1=value1¶m2=value2" ) ;
636
+ expect ( navTrackEvents [ 3 ] . body . context . page . url ) . toContain ( "/page4/subpage#section2" ) ;
637
+ expect ( navTrackEvents [ 3 ] . body . context . page . path ) . toBe ( "/page4/subpage" ) ;
638
+ expect ( navTrackEvents [ 4 ] . body . context . page . url ) . toContain ( "/final?utm_source=test&utm_medium=spa#top" ) ;
639
+ expect ( navTrackEvents [ 4 ] . body . context . page . path ) . toBe ( "/final" ) ;
640
+ expect ( navTrackEvents [ 4 ] . body . context . page . search ) . toBe ( "?utm_source=test&utm_medium=spa" ) ;
641
+ } ) ;
642
+
545
643
test ( "basic" , async ( { browser } ) => {
546
644
clearRequestLog ( ) ;
547
645
const browserContext = await browser . newContext ( ) ;
0 commit comments