@@ -24,147 +24,151 @@ import (
2424
2525func TestFieldUnmarshalJSON (t * testing.T ) {
2626 cases := []struct {
27- name string
28- input []byte
29- expected Field
27+ name string
28+ input []byte
29+ expected Field
30+ expectedErr string
31+ expectedErrRootable string
3032 }{
3133 {
32- "BodyLong" ,
33- []byte (`"body"` ),
34- NewBodyField (),
34+ name : "BodyLong" ,
35+ input : []byte (`"body"` ),
36+ expected : NewBodyField (),
3537 },
3638 {
37- "SimpleField" ,
38- []byte (`"body.test1"` ),
39- NewBodyField ("test1" ),
39+ name : "SimpleField" ,
40+ input : []byte (`"body.test1"` ),
41+ expected : NewBodyField ("test1" ),
4042 },
4143 {
42- "ComplexField" ,
43- []byte (`"body.test1.test2"` ),
44- NewBodyField ("test1" , "test2" ),
44+ name : "ComplexField" ,
45+ input : []byte (`"body.test1.test2"` ),
46+ expected : NewBodyField ("test1" , "test2" ),
4547 },
4648 {
47- "BracketedField" ,
48- []byte (`"body.test1['file.name']"` ),
49- NewBodyField ("test1" , "file.name" ),
49+ name : "BracketedField" ,
50+ input : []byte (`"body.test1['file.name']"` ),
51+ expected : NewBodyField ("test1" , "file.name" ),
5052 },
5153 {
52- "DoubleBracketedField" ,
53- []byte (`"body.test1['file.details']['file.name']"` ),
54- NewBodyField ("test1" , "file.details" , "file.name" ),
54+ name : "DoubleBracketedField" ,
55+ input : []byte (`"body.test1['file.details']['file.name']"` ),
56+ expected : NewBodyField ("test1" , "file.details" , "file.name" ),
5557 },
5658 {
57- "PostBracketField" ,
58- []byte (`"body.test1['file.details'].name"` ),
59- NewBodyField ("test1" , "file.details" , "name" ),
59+ name : "PostBracketField" ,
60+ input : []byte (`"body.test1['file.details'].name"` ),
61+ expected : NewBodyField ("test1" , "file.details" , "name" ),
6062 },
6163 {
62- "AttributesSimpleField" ,
63- []byte (`"attributes.test1"` ),
64- NewAttributeField ("test1" ),
64+ name : "AttributesSimpleField" ,
65+ input : []byte (`"attributes.test1"` ),
66+ expected : NewAttributeField ("test1" ),
6567 },
6668 {
67- "AttributesComplexField" ,
68- []byte (`"attributes.test1.test2"` ),
69- NewAttributeField ("test1" , "test2" ),
69+ name : "AttributesComplexField" ,
70+ input : []byte (`"attributes.test1.test2"` ),
71+ expected : NewAttributeField ("test1" , "test2" ),
7072 },
7173 {
72- "AttributesBracketedField" ,
73- []byte (`"attributes.test1['file.name']"` ),
74- NewAttributeField ("test1" , "file.name" ),
74+ name : "AttributesBracketedField" ,
75+ input : []byte (`"attributes.test1['file.name']"` ),
76+ expected : NewAttributeField ("test1" , "file.name" ),
7577 },
7678 {
77- "AttributesDoubleBracketedField" ,
78- []byte (`"attributes.test1['file.details']['file.name']"` ),
79- NewAttributeField ("test1" , "file.details" , "file.name" ),
79+ name : "AttributesDoubleBracketedField" ,
80+ input : []byte (`"attributes.test1['file.details']['file.name']"` ),
81+ expected : NewAttributeField ("test1" , "file.details" , "file.name" ),
8082 },
8183 {
82- "AttributesPostBracketField" ,
83- []byte (`"attributes.test1['file.details'].name"` ),
84- NewAttributeField ("test1" , "file.details" , "name" ),
84+ name : "AttributesPostBracketField" ,
85+ input : []byte (`"attributes.test1['file.details'].name"` ),
86+ expected : NewAttributeField ("test1" , "file.details" , "name" ),
8587 },
8688 {
87- "AttributesSimpleField" ,
88- []byte (`"attributes.test1"` ),
89- NewAttributeField ("test1" ),
89+ name : "AttributesSimpleField" ,
90+ input : []byte (`"attributes.test1"` ),
91+ expected : NewAttributeField ("test1" ),
9092 },
91-
9293 {
93- "ResourceSimpleField" ,
94- []byte (`"resource.test1"` ),
95- NewResourceField ("test1" ),
94+ name : "ResourceSimpleField" ,
95+ input : []byte (`"resource.test1"` ),
96+ expected : NewResourceField ("test1" ),
9697 },
9798 {
98- "ResourceComplexField" ,
99- []byte (`"resource.test1.test2"` ),
100- NewResourceField ("test1" , "test2" ),
99+ name : "ResourceComplexField" ,
100+ input : []byte (`"resource.test1.test2"` ),
101+ expected : NewResourceField ("test1" , "test2" ),
101102 },
102103 {
103- "ResourceBracketedField" ,
104- []byte (`"resource.test1['file.name']"` ),
105- NewResourceField ("test1" , "file.name" ),
104+ name : "ResourceBracketedField" ,
105+ input : []byte (`"resource.test1['file.name']"` ),
106+ expected : NewResourceField ("test1" , "file.name" ),
106107 },
107108 {
108- "ResourceDoubleBracketedField" ,
109- []byte (`"resource.test1['file.details']['file.name']"` ),
110- NewResourceField ("test1" , "file.details" , "file.name" ),
109+ name : "ResourceDoubleBracketedField" ,
110+ input : []byte (`"resource.test1['file.details']['file.name']"` ),
111+ expected : NewResourceField ("test1" , "file.details" , "file.name" ),
111112 },
112113 {
113- "ResourcePostBracketField" ,
114- []byte (`"resource.test1['file.details'].name"` ),
115- NewResourceField ("test1" , "file.details" , "name" ),
114+ name : "ResourcePostBracketField" ,
115+ input : []byte (`"resource.test1['file.details'].name"` ),
116+ expected : NewResourceField ("test1" , "file.details" , "name" ),
116117 },
117118 {
118- "ResourceSimpleField" ,
119- []byte (`"resource.test1"` ),
120- NewResourceField ("test1" ),
119+ name : "ResourceSimpleField" ,
120+ input : []byte (`"resource.test1"` ),
121+ expected : NewResourceField ("test1" ),
121122 },
122- }
123-
124- for _ , tc := range cases {
125- t .Run (tc .name , func (t * testing.T ) {
126- var f Field
127- err := json .Unmarshal (tc .input , & f )
128- require .NoError (t , err )
129- require .Equal (t , tc .expected , f )
130- })
131- }
132- }
133-
134- func TestFieldUnmarshalJSONFailure (t * testing.T ) {
135- cases := []struct {
136- name string
137- input []byte
138- expected string
139- }{
140123 {
141- "Bool" ,
142- []byte (`"bool"` ),
143- "unrecognized prefix" ,
124+ name : "AttributesRoot" ,
125+ input : []byte (`"attributes"` ),
126+ expectedErr : "attributes cannot be referenced without subfield" ,
127+ expected : NewAttributeField (),
144128 },
145129 {
146- "Object" ,
147- []byte (`{"key":"value"}` ),
148- "cannot unmarshal object into Go value of type string" ,
130+ name : "ResourceRoot" ,
131+ input : []byte (`"resource"` ),
132+ expectedErr : "resource cannot be referenced without subfield" ,
133+ expected : NewResourceField (),
149134 },
150135 {
151- "AttributesRoot " ,
152- []byte (`"attributes "` ),
153- "attributes cannot be referenced without subfield " ,
136+ name : "Bool " ,
137+ input : []byte (`"bool "` ),
138+ expectedErrRootable : "unrecognized prefix " ,
154139 },
155140 {
156- "ResourceRoot " ,
157- []byte (`"resource" ` ),
158- "resource cannot be referenced without subfield " ,
141+ name : "Object " ,
142+ input : []byte (`{"key":"value"} ` ),
143+ expectedErrRootable : " cannot unmarshal object into Go value of type string " ,
159144 },
160145 }
161146
162147 for _ , tc := range cases {
163148 t .Run (tc .name , func (t * testing.T ) {
164- var f Field
165- err := json .Unmarshal (tc .input , & f )
166- require .Error (t , err )
167- require .Contains (t , err .Error (), tc .expected )
149+ var field Field
150+ err := json .Unmarshal (tc .input , & field )
151+
152+ var rootableField RootableField
153+ errRootable := json .Unmarshal (tc .input , & rootableField )
154+
155+ switch {
156+ case tc .expectedErrRootable != "" :
157+ require .Error (t , err )
158+ require .Contains (t , err .Error (), tc .expectedErr )
159+ require .Error (t , errRootable )
160+ require .Contains (t , errRootable .Error (), tc .expectedErrRootable )
161+ case tc .expectedErr != "" :
162+ require .Error (t , err )
163+ require .Contains (t , err .Error (), tc .expectedErr )
164+ require .NoError (t , errRootable )
165+ require .Equal (t , tc .expected , rootableField .Field )
166+ default :
167+ require .NoError (t , err )
168+ require .Equal (t , tc .expected , field )
169+ require .NoError (t , errRootable )
170+ require .Equal (t , tc .expected , rootableField .Field )
171+ }
168172 })
169173 }
170174}
0 commit comments