graphql_test.rb 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. # frozen_string_literal: true
  2. require 'test_helper'
  3. require_relative 'fixtures/graphql/dummy_schema'
  4. class GraphQLTest < Test::Unit::TestCase
  5. def setup
  6. ShopifyAPI::ApiVersion.version_lookup_mode = :define_on_unknown
  7. @fixture_location = Pathname('test/fixtures/graphql')
  8. @site = 'https://this-is-my-test-shop.myshopify.com'
  9. ShopifyAPI::Base.site = @site
  10. end
  11. def teardown
  12. ShopifyAPI::GraphQL.clear_clients
  13. end
  14. test '#initialize_clients creates a GraphQL::Client from local schema file' do
  15. version_fixtures('unstable') do |dir|
  16. ShopifyAPI::GraphQL.initialize_clients
  17. assert ShopifyAPI::GraphQL.client('unstable')
  18. end
  19. end
  20. test '#initialize_clients handles multiple schema files' do
  21. version_fixtures('unstable', '2019-10') do |dir|
  22. ShopifyAPI::GraphQL.initialize_clients
  23. assert ShopifyAPI::GraphQL.client('unstable')
  24. assert ShopifyAPI::GraphQL.client('2019-10')
  25. end
  26. end
  27. test '#initialize_clients ignores non JSON schema files' do
  28. version_fixtures('unstable', '2019-10') do |dir|
  29. FileUtils.touch(ShopifyAPI::GraphQL.schema_location.join('nope.txt'))
  30. ShopifyAPI::GraphQL.initialize_clients
  31. assert ShopifyAPI::GraphQL.client('unstable')
  32. assert ShopifyAPI::GraphQL.client('2019-10')
  33. end
  34. end
  35. test '#initialize_clients raises if a JSON schema file is not named after a version' do
  36. version_fixtures do |dir|
  37. ShopifyAPI::GraphQL.schema_location = dir
  38. FileUtils.touch(ShopifyAPI::GraphQL.schema_location.join('nope.json'))
  39. assert_raises ShopifyAPI::GraphQL::InvalidSchema do
  40. ShopifyAPI::GraphQL.initialize_clients
  41. end
  42. end
  43. end
  44. test '#client returns default schema if only one exists' do
  45. version_fixtures('unstable') do |dir|
  46. ShopifyAPI::Base.api_version = 'unstable'
  47. ShopifyAPI::GraphQL.initialize_clients
  48. assert_instance_of ::GraphQL::Client, ShopifyAPI::GraphQL.client
  49. end
  50. end
  51. test '#client accepts optional api_version parameter' do
  52. version_fixtures('unstable') do |dir|
  53. ShopifyAPI::Base.api_version = 'unstable'
  54. ShopifyAPI::GraphQL.initialize_clients
  55. assert_instance_of ::GraphQL::Client, ShopifyAPI::GraphQL.client('unstable')
  56. end
  57. end
  58. test '#client executes queries on specified API version' do
  59. version_fixtures('unstable', '2019-10') do |dir|
  60. ShopifyAPI::Base.api_version = 'unstable'
  61. ShopifyAPI::GraphQL.initialize_clients
  62. ShopifyAPI::Base.site = 'https://this-is-my-test-shop.myshopify.com'
  63. client = ShopifyAPI::GraphQL.client('2019-10')
  64. assert_instance_of ::GraphQL::Client, client
  65. query = client.parse <<~GRAPHQL
  66. {
  67. product {
  68. name
  69. }
  70. }
  71. GRAPHQL
  72. path = ShopifyAPI::ApiVersion.new('2019-10').construct_graphql_path
  73. stub_request(:post, "#{@site}#{path}").to_return(body: { product: { name: 'Shirt' } }.to_json)
  74. client.query(query)
  75. end
  76. end
  77. test '#client raises exception for version that does not exist' do
  78. version_fixtures('unstable') do |dir|
  79. ShopifyAPI::Base.api_version = '2019-10'
  80. ShopifyAPI::GraphQL.initialize_clients
  81. assert_raises ShopifyAPI::GraphQL::InvalidClient do
  82. ShopifyAPI::GraphQL.client('2019-10')
  83. end
  84. end
  85. end
  86. test '#client lazily initializes clients' do
  87. version_fixtures('unstable') do |dir|
  88. ShopifyAPI::Base.api_version = 'unstable'
  89. assert_raises ShopifyAPI::GraphQL::InvalidClient do
  90. ShopifyAPI::GraphQL.client('2019-10')
  91. end
  92. end
  93. end
  94. test '#client caches lookups' do
  95. version_fixtures('unstable') do |dir|
  96. ShopifyAPI::Base.api_version = 'unstable'
  97. client1 = ShopifyAPI::GraphQL.client
  98. client2 = ShopifyAPI::GraphQL.client('unstable')
  99. assert_equal client1, client2
  100. end
  101. end
  102. private
  103. def version_fixtures(*versions)
  104. Dir.mktmpdir do |dir|
  105. versions.each do |version|
  106. FileUtils.cp(@fixture_location.join("#{version}.json"), dir)
  107. end
  108. ShopifyAPI::GraphQL.schema_location = dir
  109. yield(dir)
  110. end
  111. end
  112. end