11using System ;
22using System . IO ;
3+ using System . Linq ;
34using System . Text ;
45using System . Threading . Tasks ;
56using IsraelHiking . API . Services ;
@@ -18,6 +19,7 @@ namespace IsraelHiking.API.Tests.Services;
1819public class OfflineFilesServiceTests
1920{
2021 private const string OnTheFlyAddress = "https://mapeak.com/serve-extract/" ;
22+ private const string RoutingTilesAddress = "https://mapeak.com/routing-tiles/" ;
2123 private const string StyleAddress = "https://raw.githubusercontent.com/IsraelHikingMap/VectorMap/master/Styles/mapeak-hike.json" ;
2224 private const string Style = """
2325 {
@@ -58,7 +60,11 @@ public void TestInitialize()
5860 _fileSystemHelper . CreateFileProvider ( Arg . Any < string > ( ) ) . Returns ( _fileProvider ) ;
5961 SetupStyleResponse ( Style ) ;
6062 var options = Substitute . For < IOptions < ConfigurationData > > ( ) ;
61- options . Value . Returns ( new ConfigurationData { OnTheFlyFilesAddress = OnTheFlyAddress } ) ;
63+ options . Value . Returns ( new ConfigurationData
64+ {
65+ OnTheFlyFilesAddress = OnTheFlyAddress ,
66+ RoutingTilesAddress = RoutingTilesAddress
67+ } ) ;
6268 _service = new OfflineFilesService ( _fileSystemHelper , _remoteFileFetcherGateway , options , Substitute . For < ILogger > ( ) ) ;
6369 }
6470
@@ -85,7 +91,7 @@ public void ConstructWithoutFolder_ShouldNotCreateFileProviderAgain()
8591 [ TestMethod ]
8692 public async Task GetUpdatedFilesList_Root_ShouldReturnOnlyOnTheFlyFilesWithTodaysDate ( )
8793 {
88- var results = await _service . GetUpdatedFilesList ( DateTime . MinValue , null , null ) ;
94+ var results = await _service . GetUpdatedFilesList ( DateTime . MinValue , null , null , false ) ;
8995
9096 Assert . HasCount ( 3 , results ) ;
9197 Assert . AreEqual ( DateTime . UtcNow . Date , results [ "IHM-schema-6.pmtiles" ] ) ;
@@ -96,7 +102,7 @@ public async Task GetUpdatedFilesList_Root_ShouldReturnOnlyOnTheFlyFilesWithToda
96102 [ TestMethod ]
97103 public async Task GetUpdatedFilesList_Tile_ShouldReturnOnTheFlyAndJaxaFiles ( )
98104 {
99- var results = await _service . GetUpdatedFilesList ( DateTime . MinValue , 52 , 75 ) ;
105+ var results = await _service . GetUpdatedFilesList ( DateTime . MinValue , 52 , 75 , false ) ;
100106
101107 Assert . HasCount ( 4 , results ) ;
102108 Assert . AreEqual ( DateTime . UtcNow . Date , results [ "IHM-schema+7-52-75.pmtiles" ] ) ;
@@ -105,18 +111,71 @@ public async Task GetUpdatedFilesList_Tile_ShouldReturnOnTheFlyAndJaxaFiles()
105111 Assert . IsTrue ( results . ContainsKey ( "jaxa_terrarium0-11_v2+7-52-75.pmtiles" ) ) ;
106112 }
107113
114+ [ TestMethod ]
115+ public async Task GetUpdatedFilesList_TileWithValhalla_ShouldAlsoReturnTheValhallaFile ( )
116+ {
117+ var results = await _service . GetUpdatedFilesList ( DateTime . MinValue , 52 , 75 , true ) ;
118+
119+ Assert . HasCount ( 5 , results ) ;
120+ Assert . AreEqual ( DateTime . UtcNow . Date , results [ "valhalla+7-52-75.tar" ] ) ;
121+ }
122+
123+ [ TestMethod ]
124+ public async Task GetUpdatedFilesList_TileWithoutValhalla_ShouldNotReturnTheValhallaFile ( )
125+ {
126+ var results = await _service . GetUpdatedFilesList ( DateTime . MinValue , 52 , 75 , false ) ;
127+
128+ Assert . IsFalse ( results . Keys . Any ( k => k . StartsWith ( "valhalla" ) ) ) ;
129+ }
130+
131+ [ TestMethod ]
132+ public async Task GetUpdatedFilesList_RootWithValhalla_ShouldNotReturnTheValhallaFile ( )
133+ {
134+ var results = await _service . GetUpdatedFilesList ( DateTime . MinValue , null , null , true ) ;
135+
136+ Assert . IsFalse ( results . Keys . Any ( k => k . StartsWith ( "valhalla" ) ) ) ;
137+ }
138+
139+ [ TestMethod ]
140+ public async Task GetUpdatedFilesList_ValhallaUpToDate_ShouldNotReturnTheValhallaFile ( )
141+ {
142+ var results = await _service . GetUpdatedFilesList ( DateTime . UtcNow . AddDays ( 1 ) , 52 , 75 , true ) ;
143+
144+ Assert . IsFalse ( results . Keys . Any ( k => k . StartsWith ( "valhalla" ) ) ) ;
145+ }
146+
147+ [ TestMethod ]
148+ public async Task GetFileContent_ValhallaFile_ShouldBeFetchedFromTheRoutingTilesServer ( )
149+ {
150+ _remoteFileFetcherGateway . GetFileStream ( Arg . Any < string > ( ) ) . Returns ( ( new MemoryStream ( ) as Stream , ( long ? ) 0 ) ) ;
151+
152+ await _service . GetFileContent ( "valhalla+7-52-75.tar" , 52 , 75 ) ;
153+
154+ await _remoteFileFetcherGateway . Received ( 1 ) . GetFileStream ( RoutingTilesAddress + "valhalla+7-52-75.tar" ) ;
155+ }
156+
157+ [ TestMethod ]
158+ public async Task GetFileContent_NonValhallaFile_ShouldBeFetchedFromTheOnTheFlyServer ( )
159+ {
160+ _remoteFileFetcherGateway . GetFileStream ( Arg . Any < string > ( ) ) . Returns ( ( new MemoryStream ( ) as Stream , ( long ? ) 0 ) ) ;
161+
162+ await _service . GetFileContent ( "IHM-schema+7-52-75.pmtiles" , 52 , 75 ) ;
163+
164+ await _remoteFileFetcherGateway . Received ( 1 ) . GetFileStream ( OnTheFlyAddress + "IHM-schema+7-52-75.pmtiles" ) ;
165+ }
166+
108167 [ TestMethod ]
109168 public async Task GetUpdatedFilesList_ShouldNotReturnContourFiles ( )
110169 {
111- var results = await _service . GetUpdatedFilesList ( DateTime . MinValue , 52 , 75 ) ;
170+ var results = await _service . GetUpdatedFilesList ( DateTime . MinValue , 52 , 75 , false ) ;
112171
113172 Assert . IsFalse ( results . ContainsKey ( "JAXA_AW3D30_2024_contour_z5-Z12_vector+7-52-75.pmtiles" ) ) ;
114173 }
115174
116175 [ TestMethod ]
117176 public async Task GetUpdatedFilesList_JaxaFiles_ShouldUseFixedDates ( )
118177 {
119- var results = await _service . GetUpdatedFilesList ( DateTime . MinValue , 52 , 75 ) ;
178+ var results = await _service . GetUpdatedFilesList ( DateTime . MinValue , 52 , 75 , false ) ;
120179
121180 Assert . AreEqual ( DateTimeOffset . Parse ( "2026-04-09T10:36:08.8024764Z" ) . UtcDateTime ,
122181 results [ "jaxa_terrarium0-11_v2+7-52-75.pmtiles" ] . ToUniversalTime ( ) ) ;
@@ -125,7 +184,7 @@ public async Task GetUpdatedFilesList_JaxaFiles_ShouldUseFixedDates()
125184 [ TestMethod ]
126185 public async Task GetUpdatedFilesList_EverythingUpToDate_ShouldReturnEmptyList ( )
127186 {
128- var results = await _service . GetUpdatedFilesList ( DateTime . UtcNow . AddDays ( 1 ) , 52 , 75 ) ;
187+ var results = await _service . GetUpdatedFilesList ( DateTime . UtcNow . AddDays ( 1 ) , 52 , 75 , false ) ;
129188
130189 Assert . IsEmpty ( results ) ;
131190 }
@@ -134,7 +193,7 @@ public async Task GetUpdatedFilesList_EverythingUpToDate_ShouldReturnEmptyList()
134193 public async Task GetUpdatedFilesList_OnlyJaxaUpToDate_ShouldReturnOnlyOnTheFlyFiles ( )
135194 {
136195 // A last-modified between the fixed jaxa dates and today filters out jaxa but keeps the on-the-fly files.
137- var results = await _service . GetUpdatedFilesList ( new DateTime ( 2026 , 5 , 1 , 0 , 0 , 0 , DateTimeKind . Utc ) , 52 , 75 ) ;
196+ var results = await _service . GetUpdatedFilesList ( new DateTime ( 2026 , 5 , 1 , 0 , 0 , 0 , DateTimeKind . Utc ) , 52 , 75 , false ) ;
138197
139198 Assert . HasCount ( 3 , results ) ;
140199 Assert . IsTrue ( results . ContainsKey ( "IHM-schema+7-52-75.pmtiles" ) ) ;
@@ -144,16 +203,16 @@ public async Task GetUpdatedFilesList_OnlyJaxaUpToDate_ShouldReturnOnlyOnTheFlyF
144203 [ TestMethod ]
145204 public async Task GetUpdatedFilesList_ShouldNotReadFileSystem ( )
146205 {
147- await _service . GetUpdatedFilesList ( DateTime . MinValue , 52 , 75 ) ;
206+ await _service . GetUpdatedFilesList ( DateTime . MinValue , 52 , 75 , false ) ;
148207
149208 _fileProvider . DidNotReceive ( ) . GetDirectoryContents ( Arg . Any < string > ( ) ) ;
150209 }
151210
152211 [ TestMethod ]
153212 public async Task GetUpdatedFilesList_Twice_ShouldFetchTheStyleOnlyOnce ( )
154213 {
155- await _service . GetUpdatedFilesList ( DateTime . MinValue , null , null ) ;
156- await _service . GetUpdatedFilesList ( DateTime . MinValue , 52 , 75 ) ;
214+ await _service . GetUpdatedFilesList ( DateTime . MinValue , null , null , false ) ;
215+ await _service . GetUpdatedFilesList ( DateTime . MinValue , 52 , 75 , false ) ;
157216
158217 await _remoteFileFetcherGateway . Received ( 1 ) . GetFileContent ( StyleAddress ) ;
159218 }
@@ -165,7 +224,7 @@ public async Task GetUpdatedFilesList_StyleFetchFailsOnce_ShouldRetryAndSucceed(
165224 _ => throw new Exception ( "some error" ) ,
166225 _ => new RemoteFileFetcherGatewayResponse { Content = Encoding . UTF8 . GetBytes ( Style ) } ) ;
167226
168- var results = await _service . GetUpdatedFilesList ( DateTime . MinValue , null , null ) ;
227+ var results = await _service . GetUpdatedFilesList ( DateTime . MinValue , null , null , false ) ;
169228
170229 Assert . HasCount ( 3 , results ) ;
171230 await _remoteFileFetcherGateway . Received ( 2 ) . GetFileContent ( StyleAddress ) ;
@@ -177,7 +236,7 @@ public async Task GetUpdatedFilesList_StyleFetchReturnsEmptyContent_ShouldRetryA
177236 _remoteFileFetcherGateway . GetFileContent ( StyleAddress )
178237 . Returns ( new RemoteFileFetcherGatewayResponse { Content = [ ] } ) ;
179238
180- await Assert . ThrowsExactlyAsync < InvalidOperationException > ( ( ) => _service . GetUpdatedFilesList ( DateTime . MinValue , null , null ) ) ;
239+ await Assert . ThrowsExactlyAsync < InvalidOperationException > ( ( ) => _service . GetUpdatedFilesList ( DateTime . MinValue , null , null , false ) ) ;
181240 await _remoteFileFetcherGateway . Received ( 3 ) . GetFileContent ( StyleAddress ) ;
182241 }
183242
@@ -186,7 +245,7 @@ public async Task GetUpdatedFilesList_AliasedDemSource_ShouldReturnTheAliasNameW
186245 {
187246 SetupStyleResponse ( StyleWithAliasedDem ) ;
188247
189- var results = await _service . GetUpdatedFilesList ( DateTime . MinValue , 52 , 75 ) ;
248+ var results = await _service . GetUpdatedFilesList ( DateTime . MinValue , 52 , 75 , false ) ;
190249
191250 Assert . HasCount ( 4 , results ) ;
192251 Assert . IsFalse ( results . ContainsKey ( "jaxa_terrarium0-11_v2+7-52-75.pmtiles" ) ) ;
@@ -199,7 +258,7 @@ public async Task GetUpdatedFilesList_AliasedDemSourceForRoot_ShouldNotReturnIt(
199258 {
200259 SetupStyleResponse ( StyleWithAliasedDem ) ;
201260
202- var results = await _service . GetUpdatedFilesList ( DateTime . MinValue , null , null ) ;
261+ var results = await _service . GetUpdatedFilesList ( DateTime . MinValue , null , null , false ) ;
203262
204263 Assert . HasCount ( 3 , results ) ;
205264 Assert . IsFalse ( results . ContainsKey ( "raster-dem-6.pmtiles" ) ) ;
0 commit comments