11import { describe , expect , it , vi } from '@effect/vitest' ;
22import * as sentryCore from '@sentry/core' ;
33import { logger as sentryLogger } from '@sentry/core' ;
4+ import type { NodeOptions } from '@sentry/node-core' ;
45import { Effect , Layer } from 'effect' ;
56import { empty as emptyLayer } from 'effect/Layer' ;
7+ import { init } from '../src/index.server' ;
68import { buildEffectLayer } from '../src/utils/buildEffectLayer' ;
79
10+ function getMockTransport ( ) {
11+ return ( ) => ( {
12+ send : vi . fn ( ) . mockResolvedValue ( { } ) ,
13+ flush : vi . fn ( ) . mockResolvedValue ( true ) ,
14+ } ) ;
15+ }
16+
17+ function createClient ( options : NodeOptions = { } ) {
18+ return init ( {
19+ dsn : 'https://username@domain/123' ,
20+ transport : getMockTransport ( ) ,
21+ ...options ,
22+ } ) ;
23+ }
24+
825describe ( 'buildEffectLayer' , ( ) => {
926 describe ( 'when client is falsy' , ( ) => {
1027 it ( 'returns empty layer when client is null' , ( ) => {
11- const layer = buildEffectLayer ( { } , null ) ;
28+ const layer = buildEffectLayer ( { } , undefined ) ;
1229
1330 expect ( layer ) . toBeDefined ( ) ;
1431 expect ( Layer . isLayer ( layer ) ) . toBe ( true ) ;
@@ -25,45 +42,49 @@ describe('buildEffectLayer', () => {
2542 } ) ;
2643
2744 describe ( 'when client is truthy' , ( ) => {
28- const mockClient = { mock : true } ;
29-
3045 it ( 'returns a valid layer with default options' , ( ) => {
31- const layer = buildEffectLayer ( { } , mockClient ) ;
46+ const client = createClient ( ) ;
47+ const layer = buildEffectLayer ( { } , client ) ;
3248
3349 expect ( layer ) . toBeDefined ( ) ;
3450 expect ( Layer . isLayer ( layer ) ) . toBe ( true ) ;
3551 } ) ;
3652
3753 it ( 'returns a valid layer with enableEffectLogs: false' , ( ) => {
38- const layer = buildEffectLayer ( { enableEffectLogs : false } , mockClient ) ;
54+ const client = createClient ( ) ;
55+ const layer = buildEffectLayer ( { enableEffectLogs : false } , client ) ;
3956
4057 expect ( layer ) . toBeDefined ( ) ;
4158 expect ( Layer . isLayer ( layer ) ) . toBe ( true ) ;
4259 } ) ;
4360
4461 it ( 'returns a valid layer with enableEffectLogs: true' , ( ) => {
45- const layer = buildEffectLayer ( { enableEffectLogs : true } , mockClient ) ;
62+ const client = createClient ( ) ;
63+ const layer = buildEffectLayer ( { enableEffectLogs : true } , client ) ;
4664
4765 expect ( layer ) . toBeDefined ( ) ;
4866 expect ( Layer . isLayer ( layer ) ) . toBe ( true ) ;
4967 } ) ;
5068
5169 it ( 'returns a valid layer with enableEffectMetrics: false' , ( ) => {
52- const layer = buildEffectLayer ( { enableEffectMetrics : false } , mockClient ) ;
70+ const client = createClient ( ) ;
71+ const layer = buildEffectLayer ( { enableEffectMetrics : false } , client ) ;
5372
5473 expect ( layer ) . toBeDefined ( ) ;
5574 expect ( Layer . isLayer ( layer ) ) . toBe ( true ) ;
5675 } ) ;
5776
5877 it ( 'returns a valid layer with enableEffectMetrics: true' , ( ) => {
59- const layer = buildEffectLayer ( { enableEffectMetrics : true } , mockClient ) ;
78+ const client = createClient ( ) ;
79+ const layer = buildEffectLayer ( { enableEffectMetrics : true } , client ) ;
6080
6181 expect ( layer ) . toBeDefined ( ) ;
6282 expect ( Layer . isLayer ( layer ) ) . toBe ( true ) ;
6383 } ) ;
6484
6585 it ( 'returns a valid layer with all features enabled' , ( ) => {
66- const layer = buildEffectLayer ( { enableEffectLogs : true , enableEffectMetrics : true } , mockClient ) ;
86+ const client = createClient ( ) ;
87+ const layer = buildEffectLayer ( { enableEffectLogs : true , enableEffectMetrics : true } , client ) ;
6788
6889 expect ( layer ) . toBeDefined ( ) ;
6990 expect ( Layer . isLayer ( layer ) ) . toBe ( true ) ;
@@ -73,7 +94,7 @@ describe('buildEffectLayer', () => {
7394 Effect . gen ( function * ( ) {
7495 const result = yield * Effect . succeed ( 'test-result' ) ;
7596 expect ( result ) . toBe ( 'test-result' ) ;
76- } ) . pipe ( Effect . provide ( buildEffectLayer ( { } , mockClient ) ) ) ,
97+ } ) . pipe ( Effect . provide ( buildEffectLayer ( { } , createClient ( ) ) ) ) ,
7798 ) ;
7899
79100 it . effect ( 'layer with logs enabled routes Effect logs to Sentry logger' , ( ) =>
@@ -82,12 +103,13 @@ describe('buildEffectLayer', () => {
82103 yield * Effect . log ( 'test log message' ) ;
83104 expect ( infoSpy ) . toHaveBeenCalledWith ( 'test log message' ) ;
84105 infoSpy . mockRestore ( ) ;
85- } ) . pipe ( Effect . provide ( buildEffectLayer ( { enableEffectLogs : true } , mockClient ) ) ) ,
106+ } ) . pipe ( Effect . provide ( buildEffectLayer ( { enableEffectLogs : true } , createClient ( { enableLogs : true } ) ) ) ) ,
86107 ) ;
87108
88109 it ( 'returns different layer when enableEffectMetrics is true vs false' , ( ) => {
89- const layerWithMetrics = buildEffectLayer ( { enableEffectMetrics : true } , mockClient ) ;
90- const layerWithoutMetrics = buildEffectLayer ( { enableEffectMetrics : false } , mockClient ) ;
110+ const client = createClient ( ) ;
111+ const layerWithMetrics = buildEffectLayer ( { enableEffectMetrics : true } , client ) ;
112+ const layerWithoutMetrics = buildEffectLayer ( { enableEffectMetrics : false } , client ) ;
91113
92114 expect ( layerWithMetrics ) . not . toBe ( layerWithoutMetrics ) ;
93115 } ) ;
@@ -96,7 +118,11 @@ describe('buildEffectLayer', () => {
96118 Effect . gen ( function * ( ) {
97119 const result = yield * Effect . succeed ( 'all-features' ) ;
98120 expect ( result ) . toBe ( 'all-features' ) ;
99- } ) . pipe ( Effect . provide ( buildEffectLayer ( { enableEffectLogs : true , enableEffectMetrics : true } , mockClient ) ) ) ,
121+ } ) . pipe (
122+ Effect . provide (
123+ buildEffectLayer ( { enableEffectLogs : true , enableEffectMetrics : true } , createClient ( { enableLogs : true } ) ) ,
124+ ) ,
125+ ) ,
100126 ) ;
101127
102128 it . effect ( 'layer enables tracing for Effect spans via Sentry tracer' , ( ) =>
@@ -110,12 +136,12 @@ describe('buildEffectLayer', () => {
110136 } ) ,
111137 ) ;
112138 startInactiveSpanSpy . mockRestore ( ) ;
113- } ) . pipe ( Effect . provide ( buildEffectLayer ( { } , mockClient ) ) ) ,
139+ } ) . pipe ( Effect . provide ( buildEffectLayer ( { } , createClient ( ) ) ) ) ,
114140 ) ;
115141 } ) ;
116142
117143 describe ( 'with additional options' , ( ) => {
118- const mockClient = { mock : true } ;
144+ const client = createClient ( { enableLogs : true } ) ;
119145
120146 it ( 'accepts options with additional properties' , ( ) => {
121147 const layer = buildEffectLayer (
@@ -125,7 +151,7 @@ describe('buildEffectLayer', () => {
125151 dsn : 'https://test@sentry.io/123' ,
126152 debug : true ,
127153 } as { enableEffectLogs ?: boolean ; enableEffectMetrics ?: boolean ; dsn ?: string ; debug ?: boolean } ,
128- mockClient ,
154+ client ,
129155 ) ;
130156
131157 expect ( layer ) . toBeDefined ( ) ;
0 commit comments