11package com .here .naksha .storage .http ;
22
33import org .junit .jupiter .api .Test ;
4+ import naksha .base .JvmBoxingUtil ;
5+ import naksha .base .JvmJsonUtil ;
6+ import naksha .base .Platform ;
7+ import naksha .model .objects .NakshaStorage ;
8+
9+ import java .io .IOException ;
10+ import java .io .InputStream ;
11+ import java .nio .charset .StandardCharsets ;
12+ import java .util .HashMap ;
13+ import java .util .Map ;
414
515import static org .junit .jupiter .api .Assertions .*;
616
717class HttpStoragePropertiesTest {
818
19+ private static final String TEST_RESOURCE_DIR = "/unit_test_data/HttpStorageProperties/" ;
20+
921 @ Test
1022 void shouldReturnDefaultValuesOnCreation () {
1123 // Given: a new HttpStorageProperties object created with the default constructor
@@ -39,4 +51,160 @@ void should_set_and_get_all_properties_correctly() {
3951 assertEquals (testSocketTimeout , properties .getSocketTimeout ());
4052 assertEquals (testMaxRetries , properties .getMaxRetries ());
4153 }
42- }
54+
55+ @ Test
56+ void shouldNormalizeRawHeadersMapFromBoxedProperties () {
57+ final HttpStorageProperties properties = new HttpStorageProperties ();
58+ final Map <String , String > rawHeaders = new HashMap <>();
59+ rawHeaders .put ("Authorization" , "Bearer <token>" );
60+ rawHeaders .put ("Content-Type" , "application/json" );
61+
62+ // Simulate the v3 boxed/proxy state before the typed getter runs its normalization logic.
63+ properties .setRaw ("headers" , rawHeaders );
64+
65+ final Map <String , String > headers = properties .getHeaders ();
66+ assertEquals ("Bearer <token>" , headers .get ("Authorization" ));
67+ assertEquals ("application/json" , headers .get ("Content-Type" ));
68+ assertEquals (2 , headers .size ());
69+ assertEquals (headers , properties .getRaw ("headers" ));
70+ assertTrue (headers instanceof HttpStorageProperties .HeaderMap );
71+ assertInstanceOf (Map .class , properties .getRaw ("headers" ));
72+ assertNotSame (rawHeaders , headers );
73+ }
74+
75+ @ Test
76+ void shouldStoreHeadersAsProxyWhenUsingSetter () {
77+ final HttpStorageProperties properties = new HttpStorageProperties ();
78+ final Map <String , String > headers = Map .of (
79+ "Authorization" , "Bearer exampleToken" ,
80+ "Content-Type" , "application/json"
81+ );
82+
83+ properties .setHeaders (headers );
84+
85+ assertEquals (headers , properties .getHeaders ());
86+ assertTrue (properties .getHeaders () instanceof HttpStorageProperties .HeaderMap );
87+ assertInstanceOf (Map .class , properties .getRaw ("headers" ));
88+ assertNotSame (headers , properties .getRaw ("headers" ));
89+ }
90+
91+ @ Test
92+ void shouldReturnDefaultsForInvalidRawValues () {
93+ final HttpStorageProperties properties = new HttpStorageProperties ();
94+
95+ properties .setRaw ("headers" , "invalid" );
96+
97+ assertEquals (HttpStorageProperties .DEFAULT_HEADERS , properties .getHeaders ());
98+ }
99+
100+ @ Test
101+ void shouldDeserializeAllFieldsFromJson () {
102+ final HttpStorageProperties properties = jsonResourceToPropertiesOrFail ("t01_testConvertAllFields" );
103+
104+ assertEquals ("https://example.org" , properties .getUrl ());
105+ assertEquals (60 , properties .getConnectTimeout ());
106+ assertEquals (3600 , properties .getSocketTimeout ());
107+
108+ final Map <String , String > headers = properties .getHeaders ();
109+ assertEquals ("Bearer <token>" , headers .get ("Authorization" ));
110+ assertEquals ("application/json" , headers .get ("Content-Type" ));
111+ assertEquals (2 , headers .size ());
112+ }
113+
114+ @ Test
115+ void shouldPreserveHeadersWhenBoxingStoragePropertiesFromJson () {
116+ final String storageJson ;
117+ try {
118+ storageJson = jsonResourceToStringOrFail ("t05_testBoxStorageProperties" );
119+ } catch (IOException e ) {
120+ fail ("Unable to convert json resource" , e );
121+ return ;
122+ }
123+
124+ final NakshaStorage storage = JvmBoxingUtil .box (Platform .fromJSON (storageJson ), NakshaStorage .class );
125+ assertNotNull (storage );
126+
127+ final HttpStorageProperties properties = JvmBoxingUtil .box (storage .getProperties (), HttpStorageProperties .class );
128+ assertNotNull (properties );
129+
130+ final Object rawHeaders = properties .get ("headers" );
131+ assertInstanceOf (Map .class , rawHeaders );
132+ assertFalse (rawHeaders instanceof HttpStorageProperties .HeaderMap );
133+
134+ final Map <String , String > headers = properties .getHeaders ();
135+ assertEquals ("Bearer boxed-token" , headers .get ("Authorization" ));
136+ assertEquals ("demo" , headers .get ("X-Tenant" ));
137+ assertFalse (headers .containsKey ("Accept-Encoding" ));
138+ assertEquals (2 , headers .size ());
139+ assertTrue (headers instanceof HttpStorageProperties .HeaderMap );
140+ }
141+
142+ @ Test
143+ void shouldDeserializeMissingValuesToDefaultsFromJson () {
144+ final HttpStorageProperties properties = jsonResourceToPropertiesOrFail ("t02_testConvertMissingToNull" );
145+
146+ assertEquals ("https://example.org" , properties .getUrl ());
147+ assertEquals (HttpStorageProperties .DEF_CONNECTION_TIMEOUT_SEC , properties .getConnectTimeout ());
148+ assertEquals (HttpStorageProperties .DEF_SOCKET_TIMEOUT_SEC , properties .getSocketTimeout ());
149+ assertEquals (HttpStorageProperties .DEF_MAX_RETRIES , properties .getMaxRetries ());
150+ assertEquals (HttpStorageProperties .DEFAULT_HEADERS , properties .getHeaders ());
151+ }
152+
153+ @ Test
154+ void shouldIgnoreExcessFieldsInJson () {
155+ assertDoesNotThrow (() -> jsonResourceToPropertiesOrFail ("t03_testDontThrowOnExcessFields" ));
156+ }
157+
158+ @ Test
159+ void shouldDeserializeMissingUrlAsNullInJson () {
160+ final HttpStorageProperties properties = jsonResourceToPropertiesOrFail ("t04_testThrowOnMissingMandatory" );
161+
162+ assertNull (properties .getUrl ());
163+ assertEquals (60 , properties .getConnectTimeout ());
164+ assertEquals (3600 , properties .getSocketTimeout ());
165+ assertEquals ("Bearer <token>" , properties .getHeaders ().get ("Authorization" ));
166+ assertEquals ("application/json" , properties .getHeaders ().get ("Content-Type" ));
167+ }
168+
169+ @ Test
170+ void shouldUseNormalizedHeadersMapInKeyProperties () {
171+ final HttpStorageProperties properties = new HttpStorageProperties ();
172+ final Map <String , String > rawHeaders = new HashMap <>();
173+ rawHeaders .put ("Authorization" , "Bearer <token>" );
174+ rawHeaders .put ("Content-Type" , "application/json" );
175+ properties .setUrl ("https://example.org" );
176+ properties .setRaw ("headers" , rawHeaders );
177+
178+ final RequestSender .KeyProperties fromProperties = RequestSender .KeyProperties .fromHttpStorageProperties ("test-storage" , properties );
179+
180+ assertNotNull (fromProperties .getDefaultHeaders ());
181+ assertTrue (fromProperties .getDefaultHeaders () instanceof HttpStorageProperties .HeaderMap );
182+ assertNotSame (rawHeaders , fromProperties .getDefaultHeaders ());
183+ assertEquals ("Bearer <token>" , fromProperties .getDefaultHeaders ().get ("Authorization" ));
184+ assertEquals ("application/json" , fromProperties .getDefaultHeaders ().get ("Content-Type" ));
185+ assertEquals (2 , fromProperties .getDefaultHeaders ().size ());
186+ }
187+
188+ private HttpStorageProperties jsonResourceToPropertiesOrFail (String fileName ) {
189+ try {
190+ String json = jsonResourceToStringOrFail (fileName );
191+ HttpStorageProperties properties = JvmJsonUtil .readJsonAs (json , HttpStorageProperties .class );
192+ assertNotNull (properties );
193+ return properties ;
194+ } catch (IOException e ) {
195+ fail ("Unable to convert json resource" , e );
196+ return null ;
197+ }
198+ }
199+
200+ private String jsonResourceToStringOrFail (String fileName ) throws IOException {
201+ String resource = TEST_RESOURCE_DIR + fileName + ".json" ;
202+
203+ try (InputStream testResourceStream = this .getClass ().getResourceAsStream (resource )) {
204+ if (testResourceStream == null ) {
205+ throw new IOException ("Could not access " + resource + " resource" );
206+ }
207+ return new String (testResourceStream .readAllBytes (), StandardCharsets .UTF_8 );
208+ }
209+ }
210+ }
0 commit comments