@@ -29,4 +29,162 @@ describe('span', () => {
2929 expect ( span . name ) . toEqual ( 'new name' ) ;
3030 expect ( span . description ) . toEqual ( 'new name' ) ;
3131 } ) ;
32+
33+ describe ( 'setAttribute' , ( ) => {
34+ it ( 'allows to set attributes' , ( ) => {
35+ const span = new Span ( ) ;
36+
37+ span . setAttribute ( 'str' , 'bar' ) ;
38+ span . setAttribute ( 'num' , 1 ) ;
39+ span . setAttribute ( 'zero' , 0 ) ;
40+ span . setAttribute ( 'bool' , true ) ;
41+ span . setAttribute ( 'false' , false ) ;
42+ span . setAttribute ( 'undefined' , undefined ) ;
43+ span . setAttribute ( 'numArray' , [ 1 , 2 ] ) ;
44+ span . setAttribute ( 'strArray' , [ 'aa' , 'bb' ] ) ;
45+ span . setAttribute ( 'boolArray' , [ true , false ] ) ;
46+ span . setAttribute ( 'arrayWithUndefined' , [ 1 , undefined , 2 ] ) ;
47+
48+ expect ( span . attributes ) . toEqual ( {
49+ str : 'bar' ,
50+ num : 1 ,
51+ zero : 0 ,
52+ bool : true ,
53+ false : false ,
54+ numArray : [ 1 , 2 ] ,
55+ strArray : [ 'aa' , 'bb' ] ,
56+ boolArray : [ true , false ] ,
57+ arrayWithUndefined : [ 1 , undefined , 2 ] ,
58+ } ) ;
59+ } ) ;
60+
61+ it ( 'deletes attributes when setting to `undefined`' , ( ) => {
62+ const span = new Span ( ) ;
63+
64+ span . setAttribute ( 'str' , 'bar' ) ;
65+
66+ expect ( Object . keys ( span . attributes ) . length ) . toEqual ( 1 ) ;
67+
68+ span . setAttribute ( 'str' , undefined ) ;
69+
70+ expect ( Object . keys ( span . attributes ) . length ) . toEqual ( 0 ) ;
71+ } ) ;
72+
73+ it ( 'disallows invalid attribute types' , ( ) => {
74+ const span = new Span ( ) ;
75+
76+ /** @ts -expect-error this is invalid */
77+ span . setAttribute ( 'str' , { } ) ;
78+
79+ /** @ts -expect-error this is invalid */
80+ span . setAttribute ( 'str' , null ) ;
81+
82+ /** @ts -expect-error this is invalid */
83+ span . setAttribute ( 'str' , [ 1 , 'a' ] ) ;
84+ } ) ;
85+ } ) ;
86+
87+ describe ( 'setAttributes' , ( ) => {
88+ it ( 'allows to set attributes' , ( ) => {
89+ const span = new Span ( ) ;
90+
91+ const initialAttributes = span . attributes ;
92+
93+ expect ( initialAttributes ) . toEqual ( { } ) ;
94+
95+ const newAttributes = {
96+ str : 'bar' ,
97+ num : 1 ,
98+ zero : 0 ,
99+ bool : true ,
100+ false : false ,
101+ undefined : undefined ,
102+ numArray : [ 1 , 2 ] ,
103+ strArray : [ 'aa' , 'bb' ] ,
104+ boolArray : [ true , false ] ,
105+ arrayWithUndefined : [ 1 , undefined , 2 ] ,
106+ } ;
107+ span . setAttributes ( newAttributes ) ;
108+
109+ expect ( span . attributes ) . toEqual ( {
110+ str : 'bar' ,
111+ num : 1 ,
112+ zero : 0 ,
113+ bool : true ,
114+ false : false ,
115+ numArray : [ 1 , 2 ] ,
116+ strArray : [ 'aa' , 'bb' ] ,
117+ boolArray : [ true , false ] ,
118+ arrayWithUndefined : [ 1 , undefined , 2 ] ,
119+ } ) ;
120+
121+ expect ( span . attributes ) . not . toBe ( newAttributes ) ;
122+
123+ span . setAttributes ( {
124+ num : 2 ,
125+ numArray : [ 3 , 4 ] ,
126+ } ) ;
127+
128+ expect ( span . attributes ) . toEqual ( {
129+ str : 'bar' ,
130+ num : 2 ,
131+ zero : 0 ,
132+ bool : true ,
133+ false : false ,
134+ numArray : [ 3 , 4 ] ,
135+ strArray : [ 'aa' , 'bb' ] ,
136+ boolArray : [ true , false ] ,
137+ arrayWithUndefined : [ 1 , undefined , 2 ] ,
138+ } ) ;
139+ } ) ;
140+
141+ it ( 'deletes attributes when setting to `undefined`' , ( ) => {
142+ const span = new Span ( ) ;
143+
144+ span . setAttribute ( 'str' , 'bar' ) ;
145+
146+ expect ( Object . keys ( span . attributes ) . length ) . toEqual ( 1 ) ;
147+
148+ span . setAttributes ( { str : undefined } ) ;
149+
150+ expect ( Object . keys ( span . attributes ) . length ) . toEqual ( 0 ) ;
151+ } ) ;
152+ } ) ;
153+
154+ // Ensure that attributes & data are merged together
155+ describe ( '_getData' , ( ) => {
156+ it ( 'works without data & attributes' , ( ) => {
157+ const span = new Span ( ) ;
158+
159+ expect ( span [ '_getData' ] ( ) ) . toEqual ( undefined ) ;
160+ } ) ;
161+
162+ it ( 'works with data only' , ( ) => {
163+ const span = new Span ( ) ;
164+ span . setData ( 'foo' , 'bar' ) ;
165+
166+ expect ( span [ '_getData' ] ( ) ) . toEqual ( { foo : 'bar' } ) ;
167+ expect ( span [ '_getData' ] ( ) ) . toBe ( span . data ) ;
168+ } ) ;
169+
170+ it ( 'works with attributes only' , ( ) => {
171+ const span = new Span ( ) ;
172+ span . setAttribute ( 'foo' , 'bar' ) ;
173+
174+ expect ( span [ '_getData' ] ( ) ) . toEqual ( { foo : 'bar' } ) ;
175+ expect ( span [ '_getData' ] ( ) ) . toBe ( span . attributes ) ;
176+ } ) ;
177+
178+ it ( 'merges data & attributes' , ( ) => {
179+ const span = new Span ( ) ;
180+ span . setAttribute ( 'foo' , 'foo' ) ;
181+ span . setAttribute ( 'bar' , 'bar' ) ;
182+ span . setData ( 'foo' , 'foo2' ) ;
183+ span . setData ( 'baz' , 'baz' ) ;
184+
185+ expect ( span [ '_getData' ] ( ) ) . toEqual ( { foo : 'foo' , bar : 'bar' , baz : 'baz' } ) ;
186+ expect ( span [ '_getData' ] ( ) ) . not . toBe ( span . attributes ) ;
187+ expect ( span [ '_getData' ] ( ) ) . not . toBe ( span . data ) ;
188+ } ) ;
189+ } ) ;
32190} ) ;
0 commit comments