@@ -201,6 +201,63 @@ def test_rest_disabled_can_be_set_in_setup
201201 assert ( ShopifyAPI ::Context . rest_disabled )
202202 end
203203
204+ def test_load_rest_resources_uses_rest_resource_version
205+ # Test that the rest_resource_version method is used to handle fallback for release candidate versions
206+ release_candidate = ShopifyAPI ::AdminVersions ::RELEASE_CANDIDATE_ADMIN_VERSION
207+ latest_supported = ShopifyAPI ::AdminVersions ::LATEST_SUPPORTED_ADMIN_VERSION
208+
209+ ShopifyAPI ::AdminVersions . expects ( :rest_resource_version ) . with ( release_candidate ) . returns ( latest_supported )
210+ version_folder_name = latest_supported . gsub ( "-" , "_" )
211+ Dir . expects ( :exist? ) . with ( regexp_matches ( %r{.*/lib/shopify_api/rest/resources/#{ version_folder_name } $} ) ) . returns ( true )
212+ original_method = Zeitwerk ::Loader . method ( :new )
213+
214+ begin
215+ # Create a real Zeitwerk::Loader instance that we can stub
216+ loader = Zeitwerk ::Loader . new
217+ Zeitwerk ::Loader . stubs ( :new ) . returns ( loader )
218+
219+ # Now stub the methods on the real loader
220+ loader . expects ( :enable_reloading ) . once
221+ loader . expects ( :ignore ) . once
222+ loader . expects ( :setup ) . once
223+ loader . expects ( :push_dir ) . once
224+ loader . expects ( :reload ) . once
225+
226+ # Call load_rest_resources with the release candidate version
227+ ShopifyAPI ::Context . load_rest_resources ( api_version : release_candidate )
228+ ensure
229+ # Restore the original method to avoid affecting other tests
230+ Zeitwerk ::Loader . singleton_class . send ( :define_method , :new , original_method )
231+ end
232+ end
233+
234+ def test_load_rest_resources_when_resources_dont_exist
235+ # Test behavior when REST resources directory doesn't exist
236+ version = "2023-01"
237+ version_folder_name = version . gsub ( "-" , "_" )
238+
239+ # Mock Dir.exist? to return false, indicating resources don't exist
240+ Dir . expects ( :exist? ) . with ( regexp_matches ( %r{.*/lib/shopify_api/rest/resources/#{ version_folder_name } $} ) ) . returns ( false )
241+
242+ # Reset the notified_missing_resources_folder hash to ensure warning is logged
243+ ShopifyAPI ::Context . instance_variable_set ( :@notified_missing_resources_folder , { } )
244+
245+ # Expect a warning to be logged
246+ logger_mock = mock
247+ logger_mock . expects ( :warn ) . with ( regexp_matches ( /Cannot autoload REST resources for API version '#{ version_folder_name } '/ ) )
248+ ShopifyAPI ::Context . instance_variable_set ( :@logger , logger_mock )
249+
250+ # Ensure Zeitwerk loader is not created or used
251+ Zeitwerk ::Loader . expects ( :new ) . never
252+
253+ # Call load_rest_resources with the version
254+ ShopifyAPI ::Context . load_rest_resources ( api_version : version )
255+
256+ # Verify the version was added to the notified list
257+ notified = ShopifyAPI ::Context . instance_variable_get ( :@notified_missing_resources_folder )
258+ assert ( notified . key? ( version ) , "Version should be added to notified_missing_resources_folder" )
259+ end
260+
204261 def teardown
205262 ShopifyAPI ::Context . deactivate_session
206263 end
0 commit comments