@@ -205,8 +205,27 @@ void main() {
205205 expect (headers['X-Sdk-Version' ], tugboatSdkVersion);
206206 }
207207
208+ /// Short debounce so identity tests avoid ~3s wall-clock sleeps.
209+ const testIdentityDebounce = Duration (milliseconds: 40 );
210+
211+ CollectorHttpSink createIdentitySink ({
212+ Map <String , dynamic >? initialTraits,
213+ String ? initialTraitsId,
214+ String ? initialUserId,
215+ }) {
216+ return CollectorHttpSink (
217+ config: configForServer (),
218+ initialTraits: initialTraits,
219+ initialTraitsId: initialTraitsId,
220+ initialUserId: initialUserId,
221+ identityDebounceDuration: testIdentityDebounce,
222+ );
223+ }
224+
208225 Future <void > awaitIdentityDebounce () async {
209- await Future <void >.delayed (const Duration (milliseconds: 3100 ));
226+ await Future <void >.delayed (
227+ testIdentityDebounce + const Duration (milliseconds: 40 ),
228+ );
210229 }
211230
212231 test ('collector defaults flush low-volume events every 3 seconds' , () {
@@ -796,7 +815,7 @@ void main() {
796815 'setTraits posts traits_updated, caches traitsId, stamps next events' ,
797816 () async {
798817 sessionResponseTraitsId = 'trt_abc' ;
799- final sink = CollectorHttpSink (config : configForServer () );
818+ final sink = createIdentitySink ( );
800819 final session = createSession ();
801820 sink.startSession (session);
802821 await Future <void >.delayed (const Duration (milliseconds: 50 ));
@@ -898,7 +917,7 @@ void main() {
898917 'new session_start includes traits bag after mid-session setTraits' ,
899918 () async {
900919 sessionResponseTraitsId = 'trt_mid' ;
901- final sink = CollectorHttpSink (config : configForServer () );
920+ final sink = createIdentitySink ( );
902921 sink.startSession (createSession (id: 'session-a' ));
903922 await Future <void >.delayed (const Duration (milliseconds: 50 ));
904923 expect (sessionPosts, hasLength (1 ));
@@ -944,8 +963,7 @@ void main() {
944963
945964 test ('setUserId posts user_changed with cached traits' , () async {
946965 sessionResponseTraitsId = 'trt_user' ;
947- final sink = CollectorHttpSink (
948- config: configForServer (),
966+ final sink = createIdentitySink (
949967 initialTraits: {'plan' : 'pro' },
950968 initialUserId: 'user_a' ,
951969 );
@@ -1018,10 +1036,7 @@ void main() {
10181036 );
10191037
10201038 test ('setUserId no-ops when user id is unchanged' , () async {
1021- final sink = CollectorHttpSink (
1022- config: configForServer (),
1023- initialUserId: 'user_a' ,
1024- );
1039+ final sink = createIdentitySink (initialUserId: 'user_a' );
10251040 sink.startSession (createSession ());
10261041 await Future <void >.delayed (const Duration (milliseconds: 50 ));
10271042 expect (sessionPosts, hasLength (1 ));
@@ -1045,7 +1060,7 @@ void main() {
10451060
10461061 test ('setTraits no-ops when traits bag is unchanged' , () async {
10471062 sessionResponseTraitsId = 'trt_skip' ;
1048- final sink = CollectorHttpSink (config : configForServer () );
1063+ final sink = createIdentitySink ( );
10491064 sink.startSession (createSession ());
10501065 await Future <void >.delayed (const Duration (milliseconds: 50 ));
10511066 expect (sessionPosts, hasLength (1 ));
@@ -1071,7 +1086,7 @@ void main() {
10711086 'setUserId then setTraits within debounce posts session_identify once' ,
10721087 () async {
10731088 sessionResponseTraitsId = 'trt_both' ;
1074- final sink = CollectorHttpSink (config : configForServer () );
1089+ final sink = createIdentitySink ( );
10751090 sink.startSession (createSession ());
10761091 await Future <void >.delayed (const Duration (milliseconds: 50 ));
10771092 expect (sessionPosts, hasLength (1 ));
@@ -1097,7 +1112,7 @@ void main() {
10971112 );
10981113
10991114 test ('debounced identity uses first dirty time as triggeredAt' , () async {
1100- final sink = CollectorHttpSink (config : configForServer () );
1115+ final sink = createIdentitySink ( );
11011116 sink.startSession (createSession ());
11021117 await Future <void >.delayed (const Duration (milliseconds: 50 ));
11031118
@@ -1121,7 +1136,9 @@ void main() {
11211136 isTrue,
11221137 );
11231138 expect (
1124- triggeredAt.isBefore (afterDebounce.subtract (const Duration (seconds: 2 ))),
1139+ triggeredAt.isBefore (
1140+ afterDebounce.subtract (const Duration (milliseconds: 20 )),
1141+ ),
11251142 isTrue,
11261143 );
11271144 sink.dispose ();
@@ -1130,12 +1147,12 @@ void main() {
11301147 test (
11311148 'coalesced identity triggeredAt reflects latest dirty mark when both change' ,
11321149 () async {
1133- final sink = CollectorHttpSink (config : configForServer () );
1150+ final sink = createIdentitySink ( );
11341151 sink.startSession (createSession ());
11351152 await Future <void >.delayed (const Duration (milliseconds: 50 ));
11361153
11371154 await sink.setUserId ('user_at' );
1138- await Future <void >.delayed (const Duration (milliseconds: 200 ));
1155+ await Future <void >.delayed (const Duration (milliseconds: 15 ));
11391156 final beforeTraits = DateTime .now ();
11401157 await sink.setTraits ({'plan' : 'pro' });
11411158 final afterTraits = DateTime .now ();
@@ -1161,7 +1178,7 @@ void main() {
11611178
11621179 test ('endSession flushes debounced identity before session_end' , () async {
11631180 sessionResponseTraitsId = 'trt_end' ;
1164- final sink = CollectorHttpSink (config : configForServer () );
1181+ final sink = createIdentitySink ( );
11651182 sink.startSession (createSession ());
11661183 await Future <void >.delayed (const Duration (milliseconds: 50 ));
11671184
0 commit comments