solidus_graphql_api 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # SolidusGraphqlApi
2
2
 
3
- [![Maintainability](https://api.codeclimate.com/v1/badges/8ea7739ad6726ad8cfa7/maintainability)](https://codeclimate.com/github/solidusio-contrib/solidus_graphql_api/maintainability)
4
- [![Test Coverage](https://api.codeclimate.com/v1/badges/8ea7739ad6726ad8cfa7/test_coverage)](https://codeclimate.com/github/solidusio-contrib/solidus_graphql_api/test_coverage)
5
- [![CircleCI](https://circleci.com/gh/solidusio-contrib/solidus_graphql_api.svg?style=shield)](https://circleci.com/gh/solidusio-contrib/solidus_graphql_api)
3
+ [![Maintainability](https://api.codeclimate.com/v1/badges/8ea7739ad6726ad8cfa7/maintainability)](https://codeclimate.com/github/solidusio/solidus_graphql_api/maintainability)
4
+ [![Test Coverage](https://api.codeclimate.com/v1/badges/8ea7739ad6726ad8cfa7/test_coverage)](https://codeclimate.com/github/solidusio/solidus_graphql_api/test_coverage)
5
+ [![CircleCI](https://circleci.com/gh/solidusio/solidus_graphql_api.svg?style=shield)](https://circleci.com/gh/solidusio/solidus_graphql_api)
6
6
  [![Gem Version](https://badge.fury.io/rb/solidus_graphql_api.svg)](https://badge.fury.io/rb/solidus_graphql_api)
7
7
 
8
8
  Provides a [graphql](https://graphql.org/) api for the [Solidus](https://github.com/solidusio/solidus) ecommerce framework.
@@ -36,7 +36,7 @@ POST http://localhost:3000/graphql
36
36
 
37
37
  ## Documentation
38
38
 
39
- The Solidus GraphQL API documentation can be found [here](https://solidusio-contrib.github.io/solidus_graphql_api/docs/).
39
+ The Solidus GraphQL API documentation can be found [here](https://solidusio.github.io/solidus_graphql_api/docs/).
40
40
 
41
41
  ## Customizations
42
42
 
data/Rakefile CHANGED
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'bundler/gem_tasks'
3
4
  require 'solidus_dev_support/rake_tasks'
4
5
  require 'graphql-docs'
5
6
 
data/bin/sandbox CHANGED
@@ -22,7 +22,7 @@ if [ ! -z $SOLIDUS_BRANCH ]
22
22
  then
23
23
  BRANCH=$SOLIDUS_BRANCH
24
24
  else
25
- BRANCH="master"
25
+ BRANCH="main"
26
26
  fi
27
27
 
28
28
  extension_name="solidus_graphql_api"
@@ -50,7 +50,6 @@ fi
50
50
  cd ./sandbox
51
51
  cat <<RUBY >> Gemfile
52
52
  gem 'solidus', github: 'solidusio/solidus', branch: '$BRANCH'
53
- gem 'solidus_auth_devise', '>= 2.1.0'
54
53
  gem 'rails-i18n'
55
54
  gem 'solidus_i18n'
56
55
 
@@ -69,13 +68,10 @@ unbundled bundle exec rake db:drop db:create
69
68
 
70
69
  unbundled bundle exec rails generate solidus:install \
71
70
  --auto-accept \
72
- --user_class=Spree::User \
73
- --enforce_available_locales=true \
74
- --with-authentication=false \
71
+ --authentication=devise \
75
72
  --payment-method=none \
76
73
  $@
77
74
 
78
- unbundled bundle exec rails generate solidus:auth:install
79
75
  unbundled bundle exec rails generate ${extension_name}:install
80
76
 
81
77
  echo
@@ -108,7 +108,7 @@ module SolidusGraphqlApi
108
108
  end
109
109
 
110
110
  def graphql_loader_for(object_id, options = {}, &block)
111
- ::BatchLoader::GraphQL.for(object_id).batch(default_options.merge(options), &block)
111
+ ::BatchLoader::GraphQL.for(object_id).batch(**default_options.merge(options), &block)
112
112
  end
113
113
  end
114
114
  end
@@ -3,7 +3,7 @@
3
3
  module SolidusGraphqlApi
4
4
  class Context
5
5
  AUTHORIZATION_HEADER = "Authorization"
6
- TOKEN_PATTERN = /^Bearer (?<token>.*)/.freeze
6
+ TOKEN_PATTERN = /^Bearer (?<token>.*)/
7
7
 
8
8
  attr_reader :request, :headers
9
9
 
@@ -23,7 +23,7 @@ module SolidusGraphqlApi
23
23
 
24
24
  def current_user
25
25
  @current_user ||= begin
26
- return nil unless bearer_token&.present?
26
+ return nil if bearer_token.blank?
27
27
 
28
28
  Spree.user_class.find_by(spree_api_key: bearer_token)
29
29
  end
@@ -11,7 +11,7 @@ module SolidusGraphqlApi
11
11
  end
12
12
 
13
13
  def call
14
- SolidusGraphqlApi::BatchLoader.for(taxon, :children, scope: Spree::Taxon.order(:position, :id))
14
+ SolidusGraphqlApi::BatchLoader.for(taxon, :children, scope: Spree::Taxon.order(:id))
15
15
  end
16
16
  end
17
17
  end
@@ -11,7 +11,7 @@ module SolidusGraphqlApi
11
11
  end
12
12
 
13
13
  def call
14
- SolidusGraphqlApi::BatchLoader.for(taxonomy, :taxons, scope: Spree::Taxon.order(:position, :id))
14
+ SolidusGraphqlApi::BatchLoader.for(taxonomy, :taxons, scope: Spree::Taxon.order(:id))
15
15
  end
16
16
  end
17
17
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SolidusGraphqlApi
4
- VERSION = '0.2.0'
4
+ VERSION = '0.3.0'
5
5
  end
@@ -10,14 +10,14 @@ Gem::Specification.new do |spec|
10
10
 
11
11
  spec.summary = 'Solidus GraphQL API'
12
12
  spec.description = 'GraphQL comes to Solidus'
13
- spec.homepage = 'https://github.com/solidusio-contrib/solidus_graphql_api'
13
+ spec.homepage = 'https://github.com/solidusio/solidus_graphql_api'
14
14
  spec.license = 'BSD-3-Clause'
15
15
 
16
16
  spec.metadata['homepage_uri'] = spec.homepage
17
- spec.metadata['source_code_uri'] = 'https://github.com/solidusio-contrib/solidus_graphql_api'
18
- spec.metadata['changelog_uri'] = 'https://github.com/solidusio-contrib/solidus_graphql_api/blob/master/CHANGELOG.md'
17
+ spec.metadata['source_code_uri'] = 'https://github.com/solidusio/solidus_graphql_api'
18
+ spec.metadata['changelog_uri'] = 'https://github.com/solidusio/solidus_graphql_api/releases'
19
19
 
20
- spec.required_ruby_version = Gem::Requirement.new('~> 2.5')
20
+ spec.required_ruby_version = Gem::Requirement.new('~> 3.0')
21
21
 
22
22
  # Specify which files should be added to the gem when it is released.
23
23
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
@@ -31,8 +31,7 @@ Gem::Specification.new do |spec|
31
31
 
32
32
  spec.add_dependency 'batch-loader', '~> 2.0'
33
33
  spec.add_dependency 'graphql', '>= 1.10', '< 1.13'
34
- spec.add_dependency 'rails', '~> 6.1'
35
- spec.add_dependency 'solidus_core', ['>= 2.10', '< 4']
34
+ spec.add_dependency 'solidus_core', ['>= 3.2', '< 5']
36
35
  spec.add_dependency 'solidus_support', '~> 0.6'
37
36
 
38
37
  spec.add_development_dependency 'graphql-docs', '~> 2.0.1'
@@ -41,5 +40,4 @@ Gem::Specification.new do |spec|
41
40
  spec.add_development_dependency 'simplecov', '~> 0.21'
42
41
  spec.add_development_dependency 'solidus_dev_support', '~> 2.4'
43
42
  spec.add_development_dependency 'timecop', '~> 0.9.1'
44
- spec.add_development_dependency 'with_model', '~> 2.1.2'
45
43
  end
@@ -13,7 +13,7 @@ RSpec.describe_mutation :add_addresses_to_checkout, mutation: :add_addresses_to_
13
13
  ]
14
14
  }
15
15
 
16
- let(:country_id) { SolidusGraphqlApi::Schema.id_from_object(create(:country), nil, nil) }
16
+ let(:country_id) { SolidusGraphqlApi::Schema.id_from_object(create(:country, states_required: false), nil, nil) }
17
17
  let(:address) {
18
18
  address = build_stubbed(:address).slice(:address1, :city, :phone, :zipcode)
19
19
  address[:countryId] = country_id
@@ -9,8 +9,8 @@ RSpec.describe_query :countries, query: :countries, freeze_date: true do
9
9
  end
10
10
 
11
11
  context 'when countries exists' do
12
- let!(:us_country) { create(:country, :with_states, id: 1) }
13
- let!(:it_country) { create(:country, id: 2, iso: 'IT') }
12
+ let!(:us_country) { create(:country, :with_states, id: 1, states_required: false) }
13
+ let!(:it_country) { create(:country, id: 2, iso: 'IT', states_required: false) }
14
14
 
15
15
  it { is_expected.to match_response(:countries) }
16
16
  end
@@ -12,8 +12,13 @@ RSpec.describe_query :current_user, query: :current_user, freeze_date: true do
12
12
  bill_address: bill_address)
13
13
  }
14
14
 
15
- let(:ship_address) { create(:ship_address, id: 1, zipcode: 10_001) }
16
- let(:bill_address) { create(:bill_address, id: 2, zipcode: 10_002) }
15
+ # Previos to Solidus v3.3, states_required was always false and the state was
16
+ # always automatically assigned. We force the behavior here to have the same
17
+ # response for any Solidus version.
18
+ let(:country) { create(:country, states_required: false) }
19
+ let(:state) { create(:state, name: "Alabama", abbr: "AL", country: country) }
20
+ let(:ship_address) { create(:ship_address, id: 1, zipcode: 10_001, country: country, state: state) }
21
+ let(:bill_address) { create(:bill_address, id: 2, zipcode: 10_002, country: country, state: state) }
17
22
  let(:credit_card) {
18
23
  create(:credit_card,
19
24
  user: user,
@@ -9,9 +9,12 @@ RSpec.describe_query :taxonomies do
9
9
  end
10
10
 
11
11
  context 'when taxonomies exists' do
12
- let!(:brand_taxonomy) { create(:taxonomy, :with_taxon_meta, :with_root_icon, id: 1, root_taxon_id: 1) }
12
+ let!(:brand_taxonomy) do
13
+ create(:taxonomy, :with_taxon_meta, :with_root_icon, id: 1, name: "Brand", root_taxon_id: 1)
14
+ end
13
15
  let!(:category_taxonomy) { create(:taxonomy, :with_root_icon, id: 2, name: 'Category', root_taxon_id: 2) }
14
- let!(:taxon) { create(:taxon, :with_icon, id: 3, name: 'Solidus', taxonomy: brand_taxonomy) }
16
+ # Need to reload taxon to get the correct icon url, because the icon is attached after the taxon is created
17
+ let!(:taxon) { create(:taxon, :with_icon, id: 3, name: 'Solidus', taxonomy: brand_taxonomy).tap(&:reload) }
15
18
 
16
19
  before do
17
20
  taxon.update(parent: brand_taxonomy.root)
@@ -2,7 +2,9 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- RSpec.describe SolidusGraphqlApi::BatchLoader::BelongsTo do
5
+ RSpec.describe SolidusGraphqlApi::BatchLoader::BelongsTo, skip: (ENV["DB"] == "mysql") do
6
+ include Helpers::ActiveRecord
7
+
6
8
  subject(:loader) do
7
9
  described_class.new(
8
10
  object,
@@ -14,19 +16,21 @@ RSpec.describe SolidusGraphqlApi::BatchLoader::BelongsTo do
14
16
  let(:options) { {} }
15
17
 
16
18
  context 'with a regular association' do
17
- with_model :Article, scope: :all do
18
- model do
19
- has_many :comments
19
+ before do
20
+ run_migrations do
21
+ create_table :articles, force: true
22
+ create_table :comments, force: true do |t|
23
+ t.belongs_to :article
24
+ end
20
25
  end
26
+ create_model("Article")
27
+ create_model("Comment") { belongs_to :article }
21
28
  end
22
29
 
23
- with_model :Comment, scope: :all do
24
- table do |t|
25
- t.belongs_to :article
26
- end
27
-
28
- model do
29
- belongs_to :article
30
+ after do
31
+ run_migrations do
32
+ drop_table :articles
33
+ drop_table :comments
30
34
  end
31
35
  end
32
36
 
@@ -39,21 +43,16 @@ RSpec.describe SolidusGraphqlApi::BatchLoader::BelongsTo do
39
43
  end
40
44
 
41
45
  context 'with a polymorphic association' do
42
- with_model :Image, scope: :all do
43
- table do |t|
44
- t.integer :imageable_id
45
- t.string :imageable_type
46
- end
47
-
48
- model do
49
- belongs_to :imageable, polymorphic: true
50
- end
51
- end
52
-
53
- with_model :Article, scope: :all do
54
- model do
55
- has_many :images, as: :imageable
46
+ before do
47
+ run_migrations do
48
+ create_table :images, force: true do |t|
49
+ t.integer :imageable_id
50
+ t.string :imageable_type
51
+ end
52
+ create_table :articles, force: true
56
53
  end
54
+ create_model("Image") { belongs_to :imageable, polymorphic: true }
55
+ create_model("Article") { has_many :images, as: :imageable }
57
56
  end
58
57
 
59
58
  let!(:object) { Image.create!(imageable: Article.create!) }
@@ -2,7 +2,9 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- RSpec.describe SolidusGraphqlApi::BatchLoader::HasMany do
5
+ RSpec.describe SolidusGraphqlApi::BatchLoader::HasMany, skip: (ENV["DB"] == "mysql") do
6
+ include Helpers::ActiveRecord
7
+
6
8
  subject(:loader) do
7
9
  described_class.new(
8
10
  article,
@@ -10,28 +12,28 @@ RSpec.describe SolidusGraphqlApi::BatchLoader::HasMany do
10
12
  )
11
13
  end
12
14
 
13
- with_model :Article, scope: :all do
14
- model do
15
- has_many :comments
15
+ before do
16
+ run_migrations do
17
+ create_table :articles, force: true
18
+ create_table :comments, force: true do |t|
19
+ t.belongs_to :article
20
+ end
16
21
  end
17
- end
22
+ create_model("Article") { has_many :comments }
23
+ create_model("Comment") { belongs_to :article }
18
24
 
19
- with_model :Comment, scope: :all do
20
- table do |t|
21
- t.belongs_to :article
22
- end
25
+ article.comments.create!
26
+ end
23
27
 
24
- model do
25
- belongs_to :article
28
+ after do
29
+ run_migrations do
30
+ drop_table :articles
31
+ drop_table :comments
26
32
  end
27
33
  end
28
34
 
29
35
  let!(:article) { Article.create! }
30
36
 
31
- before do
32
- article.comments.create!
33
- end
34
-
35
37
  it 'loads the association properly' do
36
38
  expect(loader.load.sync).to eq(article.comments)
37
39
  end
@@ -2,7 +2,9 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- RSpec.describe SolidusGraphqlApi::BatchLoader::HasManyThrough do
5
+ RSpec.describe SolidusGraphqlApi::BatchLoader::HasManyThrough, skip: (ENV["DB"] == "mysql") do
6
+ include Helpers::ActiveRecord
7
+
6
8
  subject(:loader) do
7
9
  described_class.new(
8
10
  physician,
@@ -10,37 +12,40 @@ RSpec.describe SolidusGraphqlApi::BatchLoader::HasManyThrough do
10
12
  )
11
13
  end
12
14
 
13
- with_model :Physician, scope: :all do
14
- model do
15
+ before do
16
+ run_migrations do
17
+ create_table :physicians, force: true
18
+ create_table :patients, force: true
19
+ create_table :appointments, force: true do |t|
20
+ t.belongs_to :physician
21
+ t.belongs_to :patient
22
+ end
23
+ end
24
+ create_model("Physician") do
15
25
  has_many :appointments
16
26
  has_many :patients, through: :appointments
17
27
  end
18
- end
19
-
20
- with_model :Appointment, scope: :all do
21
- table do |t|
22
- t.belongs_to :physician, index: { name: :appointment_on_physician }
23
- t.belongs_to :patient
28
+ create_model("Patient") do
29
+ has_many :appointments
24
30
  end
25
-
26
- model do
31
+ create_model("Appointment") do
27
32
  belongs_to :physician
28
33
  belongs_to :patient
29
34
  end
35
+
36
+ physician.appointments.create!(patient: Patient.create!)
30
37
  end
31
38
 
32
- with_model :Patient, scope: :all do
33
- model do
34
- has_many :appointments
39
+ after do
40
+ run_migrations do
41
+ drop_table :physicians
42
+ drop_table :patients
43
+ drop_table :appointments
35
44
  end
36
45
  end
37
46
 
38
47
  let!(:physician) { Physician.create! }
39
48
 
40
- before do
41
- physician.appointments.create!(patient: Patient.create!)
42
- end
43
-
44
49
  it 'loads the association properly' do
45
50
  expect(loader.load.sync).to eq(physician.patients)
46
51
  end
@@ -2,7 +2,9 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- RSpec.describe SolidusGraphqlApi::BatchLoader::HasOne do
5
+ RSpec.describe SolidusGraphqlApi::BatchLoader::HasOne, skip: (ENV["DB"] == "mysql") do
6
+ include Helpers::ActiveRecord
7
+
6
8
  subject(:loader) do
7
9
  described_class.new(
8
10
  article,
@@ -10,28 +12,28 @@ RSpec.describe SolidusGraphqlApi::BatchLoader::HasOne do
10
12
  )
11
13
  end
12
14
 
13
- with_model :Article, scope: :all do
14
- model do
15
- has_one :image
15
+ before do
16
+ run_migrations do
17
+ create_table :articles, force: true
18
+ create_table :images, force: true do |t|
19
+ t.belongs_to :article
20
+ end
16
21
  end
17
- end
22
+ create_model("Article") { has_one :image }
23
+ create_model("Image") { belongs_to :article }
18
24
 
19
- with_model :Image, scope: :all do
20
- table do |t|
21
- t.belongs_to :article
22
- end
25
+ article.create_image!
26
+ end
23
27
 
24
- model do
25
- belongs_to :article
28
+ after do
29
+ run_migrations do
30
+ drop_table :articles
31
+ drop_table :images
26
32
  end
27
33
  end
28
34
 
29
35
  let!(:article) { Article.create! }
30
36
 
31
- before do
32
- article.create_image!
33
- end
34
-
35
37
  it 'loads the association properly' do
36
38
  expect(loader.load.sync).to eq(article.image)
37
39
  end
@@ -3,9 +3,13 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  RSpec.describe SolidusGraphqlApi::Queries::Taxon::ChildrenQuery do
6
- let(:taxon) { create(:taxon) }
7
-
8
- let!(:children) { create_list(:taxon, 2, parent: taxon) }
9
-
10
- it { expect(described_class.new(taxon: taxon).call.sync).to match_array(children) }
6
+ it do
7
+ taxonomy = create(:taxonomy)
8
+ root = taxonomy.root
9
+ children = [
10
+ create(:taxon, name: "Taxon one", parent: root),
11
+ create(:taxon, name: "Taxon two", parent: root)
12
+ ]
13
+ expect(described_class.new(taxon: root).call.sync).to match_array(children)
14
+ end
11
15
  end
@@ -3,9 +3,12 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  RSpec.describe SolidusGraphqlApi::Queries::Taxonomy::TaxonsQuery do
6
- let(:taxons) { build_list(:taxon, 2) }
7
-
8
- let(:taxonomy) { create(:taxonomy, taxons: taxons) }
9
-
10
- it { expect(described_class.new(taxonomy: taxonomy).call.sync).to match_array(taxons) }
6
+ it do
7
+ taxonomy = create(:taxonomy)
8
+ root_taxon = taxonomy.root
9
+ taxon = create(:taxon, taxonomy: taxonomy, parent: root_taxon)
10
+ create(:taxon)
11
+
12
+ expect(described_class.new(taxonomy: taxonomy).call.sync).to match_array([root_taxon, taxon])
13
+ end
11
14
  end
data/spec/spec_helper.rb CHANGED
@@ -14,7 +14,6 @@ require dummy_env
14
14
  # Requires factories and other useful helpers defined in spree_core.
15
15
  require 'solidus_dev_support/rspec/feature_helper'
16
16
  require "graphql/schema_comparator"
17
- require 'with_model'
18
17
  require 'timecop'
19
18
 
20
19
  # Requires supporting ruby files with custom matchers and macros, etc,
@@ -35,7 +34,12 @@ RSpec.configure do |config|
35
34
 
36
35
  if defined?(ActiveStorage::Current)
37
36
  config.before(:all) do
38
- ActiveStorage::Current.host = 'https://www.example.com'
37
+ test_host = 'https://www.example.com'
38
+ if Rails.gem_version >= Gem::Version.new(7)
39
+ ActiveStorage::Current.url_options = { host: test_host }
40
+ else
41
+ ActiveStorage::Current.host = test_host
42
+ end
39
43
  end
40
44
  end
41
45
 
@@ -63,6 +67,4 @@ RSpec.configure do |config|
63
67
  example.run
64
68
  end
65
69
  end
66
-
67
- config.extend WithModel
68
70
  end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Helpers
4
+ module ActiveRecord
5
+ def run_migrations(&block)
6
+ migration = Class.new(::ActiveRecord::Migration[6.1]).tap do |klass|
7
+ klass.define_method(:up, &block)
8
+ end
9
+ ::ActiveRecord::Migration.suppress_messages { migration.migrate(:up) }
10
+ end
11
+
12
+ def create_model(name, &block)
13
+ stub_const(name, Class.new(ApplicationRecord)).tap do |klass|
14
+ klass.class_eval(&block) if block_given?
15
+ end
16
+ end
17
+ end
18
+ end
@@ -14,12 +14,12 @@ module Helpers
14
14
  JSON.parse(result.to_json, object_class: object_class, symbolize_names: true)
15
15
  end
16
16
 
17
- def execute_query(*args)
18
- execute(RSpec.configuration.graphql_queries_dir, *args)
17
+ def execute_query(*args, **kwargs)
18
+ execute(RSpec.configuration.graphql_queries_dir, *args, **kwargs)
19
19
  end
20
20
 
21
- def execute_mutation(*args)
22
- execute(RSpec.configuration.graphql_mutations_dir, *args)
21
+ def execute_mutation(*args, **kwargs)
22
+ execute(RSpec.configuration.graphql_mutations_dir, *args, **kwargs)
23
23
  end
24
24
 
25
25
  def decode_field_ids(field)