solidus_identifiers 0.1.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.
Files changed (50) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/config.yml +35 -0
  3. data/.gem_release.yml +5 -0
  4. data/.github/stale.yml +17 -0
  5. data/.gitignore +21 -0
  6. data/.gitlab/ci.yml +63 -0
  7. data/.rspec +2 -0
  8. data/.rubocop.yml +17 -0
  9. data/Gemfile +33 -0
  10. data/LICENSE +26 -0
  11. data/README.md +396 -0
  12. data/Rakefile +6 -0
  13. data/app/decorators/solidus_identifiers/spree/api/api_helpers_decorator.rb +20 -0
  14. data/app/decorators/solidus_identifiers/spree/permission_sets/user_management_decorator.rb +15 -0
  15. data/app/decorators/solidus_identifiers/spree/permitted_attributes_decorator.rb +16 -0
  16. data/app/decorators/solidus_identifiers/spree/user_decorator.rb +11 -0
  17. data/app/models/spree/identifier.rb +19 -0
  18. data/app/models/spree/identifier_key.rb +17 -0
  19. data/app/views/spree/api/identifier_keys/_identifier_key.json.jbuilder +5 -0
  20. data/app/views/spree/api/identifier_keys/index.json.jbuilder +6 -0
  21. data/app/views/spree/api/identifier_keys/show.json.jbuilder +3 -0
  22. data/app/views/spree/api/identifiers/_identifier.json.jbuilder +14 -0
  23. data/app/views/spree/api/identifiers/index.json.jbuilder +6 -0
  24. data/app/views/spree/api/identifiers/show.json.jbuilder +3 -0
  25. data/app/views/spree/api/users/_user.json.jbuilder +31 -0
  26. data/bin/console +17 -0
  27. data/bin/r +15 -0
  28. data/bin/rake +7 -0
  29. data/bin/sandbox +84 -0
  30. data/bin/sandbox_rails +18 -0
  31. data/bin/setup +8 -0
  32. data/config/locales/en.yml +5 -0
  33. data/config/routes.rb +9 -0
  34. data/db/migrate/20200603191551_create_spree_identifier_keys.rb +10 -0
  35. data/db/migrate/20200603191555_create_spree_identifiers.rb +18 -0
  36. data/db/migrate/20200603203105_add_unique_index_to_spree_identifier_keys.rb +7 -0
  37. data/lib/controllers/api/spree/api/identifier_keys_controller.rb +15 -0
  38. data/lib/controllers/api/spree/api/identifiers_controller.rb +15 -0
  39. data/lib/generators/solidus_identifiers/install/install_generator.rb +26 -0
  40. data/lib/solidus_identifiers.rb +7 -0
  41. data/lib/solidus_identifiers/engine.rb +19 -0
  42. data/lib/solidus_identifiers/factories.rb +14 -0
  43. data/lib/solidus_identifiers/version.rb +5 -0
  44. data/solidus_identifiers.gemspec +38 -0
  45. data/spec/controllers/spree/api/identifier_keys_controller_spec.rb +151 -0
  46. data/spec/controllers/spree/api/identifiers_controller_spec.rb +161 -0
  47. data/spec/models/spree/identifier_key_spec.rb +21 -0
  48. data/spec/models/spree/identifier_spec.rb +33 -0
  49. data/spec/spec_helper.rb +32 -0
  50. metadata +174 -0
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusIdentifiers
4
+ module Generators
5
+ class InstallGenerator < Rails::Generators::Base
6
+ class_option :auto_run_migrations, type: :boolean, default: false
7
+
8
+ def add_javascripts; end
9
+
10
+ def add_stylesheets; end
11
+
12
+ def add_migrations
13
+ run 'bin/rails railties:install:migrations FROM=solidus_identifiers'
14
+ end
15
+
16
+ def run_migrations
17
+ run_migrations = options[:auto_run_migrations] || ['', 'y', 'Y'].include?(ask('Would you like to run the migrations now? [Y/n]')) # rubocop:disable Metrics/LineLength
18
+ if run_migrations
19
+ run 'bin/rails db:migrate'
20
+ else
21
+ puts 'Skipping bin/rails db:migrate, don\'t forget to run it!' # rubocop:disable Rails/Output
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'solidus_core'
4
+ require 'solidus_support'
5
+
6
+ require 'solidus_identifiers/version'
7
+ require 'solidus_identifiers/engine'
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spree/core'
4
+ require 'solidus_identifiers'
5
+
6
+ module SolidusIdentifiers
7
+ class Engine < Rails::Engine
8
+ include SolidusSupport::EngineExtensions
9
+
10
+ isolate_namespace ::Spree
11
+
12
+ engine_name 'solidus_identifiers'
13
+
14
+ # use rspec for tests
15
+ config.generators do |g|
16
+ g.test_framework :rspec
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :identifier_key, class: 'Spree::IdentifierKey' do
5
+ sequence(:name) { |n| "key_#{n}" }
6
+ end
7
+
8
+ factory :identifier, class: 'Spree::Identifier' do
9
+ sequence(:value) { |n| "extension-id-#{n}" }
10
+
11
+ association :key, factory: :identifier_key
12
+ association :attachable, factory: :user
13
+ end
14
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusIdentifiers
4
+ VERSION = '0.1.0'
5
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'lib/solidus_identifiers/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'solidus_identifiers'
7
+ spec.version = SolidusIdentifiers::VERSION
8
+ spec.authors = ['Taylor Scott']
9
+ spec.email = 't.skukx@gmail.com'
10
+
11
+ spec.summary = 'Map 3rd party services to a spree user'
12
+ spec.description = 'Map 3rd party services to a spree user.' \
13
+ 'These can include facebook, twitch, google, etc;'
14
+ spec.homepage = 'https://gitlab.com/deseretbook/packages/solidus_identifiers'
15
+ spec.license = 'BSD-3-Clause'
16
+
17
+ spec.metadata['homepage_uri'] = spec.homepage
18
+ spec.metadata['source_code_uri'] = 'https://gitlab.com/deseretbook/packages/solidus_identifiers'
19
+
20
+ spec.required_ruby_version = Gem::Requirement.new('~> 2.5')
21
+
22
+ # Specify which files should be added to the gem when it is released.
23
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
24
+ files = Dir.chdir(__dir__) { `git ls-files -z`.split("\x0") }
25
+
26
+ spec.files = files.grep_v(%r{^(test|spec|features)/})
27
+ spec.test_files = files.grep(%r{^(test|spec|features)/})
28
+ spec.bindir = "exe"
29
+ spec.executables = files.grep(%r{^exe/}) { |f| File.basename(f) }
30
+ spec.require_paths = ["lib"]
31
+
32
+ spec.add_dependency 'solidus_core', ['>= 2.0.0', '< 3']
33
+ spec.add_dependency 'solidus_support', '> 0.4'
34
+
35
+ spec.add_development_dependency 'byebug'
36
+ spec.add_development_dependency 'rails-controller-testing'
37
+ spec.add_development_dependency 'solidus_dev_support'
38
+ end
@@ -0,0 +1,151 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Spree::Api::IdentifierKeysController, type: :request do
6
+ subject { response }
7
+
8
+ # Setup
9
+ let(:user) { create(:user) }
10
+
11
+ let(:headers) do
12
+ { 'ACCEPT': 'application/json' }
13
+ end
14
+
15
+ custom_authorization! do |_|
16
+ can [:manage], ::Spree::IdentifierKey
17
+ end
18
+
19
+ before do
20
+ allow(Spree.user_class).to receive(:find_by).with(hash_including(:spree_api_key)) { user }
21
+ end
22
+ # End Setup
23
+
24
+ # Spree::Api::IdentifierKeysController#index
25
+ describe 'GET /api/identifier_keys' do
26
+ let(:path) { '/api/identifier_keys' }
27
+
28
+ before do
29
+ FactoryBot.create_list(:identifier_key, 5)
30
+
31
+ get path, headers: headers
32
+ end
33
+
34
+ it { is_expected.to have_http_status(:ok) }
35
+
36
+ it 'must render correct templates' do
37
+ expect(response).to render_template(:index)
38
+ expect(response).to render_template('identifier_keys/_identifier_key')
39
+ expect(response).to render_template('spree/api/shared/_pagination')
40
+ end
41
+
42
+ it 'must respond with correct content type' do
43
+ expect(response.content_type).to include 'application/json'
44
+ end
45
+ end
46
+
47
+ # Spree::Api::IdentifierKeysController#show
48
+ describe 'GET /api/identifier_keys/:id' do
49
+ let(:identifier_key) { create(:identifier_key) }
50
+ let(:path) { "/api/identifier_keys/#{identifier_key.to_param}" }
51
+
52
+ before do
53
+ get path, headers: headers
54
+ end
55
+
56
+ it { is_expected.to have_http_status(:ok) }
57
+
58
+ it 'must render correct templates' do
59
+ expect(response).to render_template(:show)
60
+ expect(response).to render_template('identifier_keys/_identifier_key')
61
+ end
62
+
63
+ it 'must respond with correct content type' do
64
+ expect(response.content_type).to include 'application/json'
65
+ end
66
+ end
67
+
68
+ # Spree::Api::IdentifierKeysController#new
69
+ describe 'GET /api/identifier_keys/new' do
70
+ let(:path) { '/api/identifier_keys/new' }
71
+
72
+ before do
73
+ get path, headers: headers
74
+ end
75
+
76
+ it { is_expected.to have_http_status(:ok) }
77
+
78
+ it 'must render correct templates' do
79
+ expect(response).to render_template(nil)
80
+ end
81
+
82
+ it 'must respond with correct content type' do
83
+ expect(response.content_type).to include 'application/json'
84
+ end
85
+ end
86
+
87
+ # Spree::Api::IdentifierKeysController#create
88
+ describe 'POST /api/identifier_keys' do
89
+ let(:path) { '/api/identifier_keys' }
90
+
91
+ before do
92
+ post path, headers: headers, params: {
93
+ identifier_key: {
94
+ name: 'test'
95
+ }
96
+ }
97
+ end
98
+
99
+ it { is_expected.to have_http_status(:created) }
100
+
101
+ it 'must render correct templates' do
102
+ expect(response).to render_template(:show)
103
+ expect(response).to render_template('identifier_keys/_identifier_key')
104
+ end
105
+
106
+ it 'must respond with correct content type' do
107
+ expect(response.content_type).to include 'application/json'
108
+ end
109
+ end
110
+
111
+ # Spree::Api::IdentifierKeysController#update
112
+ describe 'PUT /api/identifier_keys/:id' do
113
+ let(:identifier_key) { create(:identifier_key) }
114
+ let(:path) { "/api/identifier_keys/#{identifier_key.to_param}" }
115
+
116
+ before do
117
+ put path, headers: headers, params: {
118
+ identifier_key: {
119
+ name: 'test'
120
+ }
121
+ }
122
+ end
123
+
124
+ it { is_expected.to have_http_status(:ok) }
125
+
126
+ it 'must render correct templates' do
127
+ expect(response).to render_template(:show)
128
+ expect(response).to render_template('identifier_keys/_identifier_key')
129
+ end
130
+
131
+ it 'must respond with correct content type' do
132
+ expect(response.content_type).to include 'application/json'
133
+ end
134
+ end
135
+
136
+ # Spree::Api::IdentifierKeysController#delete
137
+ describe 'DELETE /api/identifier_keys' do
138
+ let(:identifier_key) { create(:identifier_key) }
139
+ let(:path) { "/api/identifier_keys/#{identifier_key.to_param}" }
140
+
141
+ before do
142
+ delete path, headers: headers
143
+ end
144
+
145
+ it { is_expected.to have_http_status(:no_content) }
146
+
147
+ it 'renders correct templates' do
148
+ expect(response).to render_template(nil)
149
+ end
150
+ end
151
+ end
@@ -0,0 +1,161 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Spree::Api::IdentifiersController, type: :request do
6
+ subject { response }
7
+
8
+ # Setup
9
+ let(:user) { create(:user) }
10
+
11
+ let(:headers) do
12
+ { 'ACCEPT': 'application/json' }
13
+ end
14
+
15
+ custom_authorization! do |_|
16
+ can [:manage], ::Spree::Identifier
17
+ end
18
+
19
+ before do
20
+ allow(Spree.user_class).to receive(:find_by).with(hash_including(:spree_api_key)) { user }
21
+ end
22
+ # End Setup
23
+
24
+ # Spree::Api::IdentifiersController#index
25
+ describe 'GET /api/identifiers' do
26
+ let(:path) { '/api/identifiers' }
27
+
28
+ before do
29
+ FactoryBot.create_list(:identifier, 5)
30
+
31
+ get path, headers: headers
32
+ end
33
+
34
+ it { is_expected.to have_http_status(:ok) }
35
+
36
+ it 'must render correct templates' do
37
+ expect(response).to render_template(:index)
38
+ expect(response).to render_template('identifiers/_identifier')
39
+ expect(response).to render_template('spree/api/shared/_pagination')
40
+ end
41
+
42
+ it 'must respond with correct content type' do
43
+ expect(response.content_type).to include 'application/json'
44
+ end
45
+ end
46
+
47
+ # Spree::Api::IdentifiersController#show
48
+ describe 'GET /api/identifiers/:id' do
49
+ let(:identifier) { create(:identifier) }
50
+ let(:path) { "/api/identifiers/#{identifier.to_param}" }
51
+
52
+ before do
53
+ get path, headers: headers
54
+ end
55
+
56
+ it { is_expected.to have_http_status(:ok) }
57
+
58
+ it 'must render correct templates' do
59
+ expect(response).to render_template(:show)
60
+ expect(response).to render_template('identifiers/_identifier')
61
+ end
62
+
63
+ it 'must respond with correct content type' do
64
+ expect(response.content_type).to include 'application/json'
65
+ end
66
+ end
67
+
68
+ # Spree::Api::IdentifiersController#new
69
+ describe 'GET /api/identifiers/new' do
70
+ let(:path) { '/api/identifiers/new' }
71
+
72
+ before do
73
+ get path, headers: headers
74
+ end
75
+
76
+ it { is_expected.to have_http_status(:ok) }
77
+
78
+ it 'must render correct templates' do
79
+ expect(response).to render_template(nil)
80
+ end
81
+
82
+ it 'must respond with correct content type' do
83
+ expect(response.content_type).to include 'application/json'
84
+ end
85
+ end
86
+
87
+ # Spree::Api::IdentifiersController#create
88
+ describe 'POST /api/identifiers' do
89
+ let(:path) { '/api/identifiers' }
90
+ let(:identifier_key) { FactoryBot.create(:identifier_key) }
91
+ let(:attachable) { FactoryBot.create(:user) }
92
+
93
+ before do
94
+ post path, headers: headers, params: {
95
+ identifier: {
96
+ value: 'test',
97
+ key_id: identifier_key.id,
98
+ attachable_id: attachable.id,
99
+ attachable_type: attachable.class.to_s
100
+ }
101
+ }
102
+ end
103
+
104
+ it { is_expected.to have_http_status(:created) }
105
+
106
+ it 'must render correct templates' do
107
+ expect(response).to render_template(:show)
108
+ expect(response).to render_template('identifiers/_identifier')
109
+ end
110
+
111
+ it 'must respond with correct content type' do
112
+ expect(response.content_type).to include 'application/json'
113
+ end
114
+ end
115
+
116
+ # Spree::Api::IdentifiersController#update
117
+ describe 'PUT /api/identifiers/:id' do
118
+ let(:identifier) { create(:identifier) }
119
+ let(:path) { "/api/identifiers/#{identifier.to_param}" }
120
+ let(:identifier_key) { FactoryBot.create(:identifier_key) }
121
+ let(:attachable) { FactoryBot.create(:user) }
122
+
123
+ before do
124
+ put path, headers: headers, params: {
125
+ identifier: {
126
+ value: 'test',
127
+ key_id: identifier_key.id,
128
+ attachable_id: attachable.id,
129
+ attachable_type: attachable.class.to_s
130
+ }
131
+ }
132
+ end
133
+
134
+ it { is_expected.to have_http_status(:ok) }
135
+
136
+ it 'must render correct templates' do
137
+ expect(response).to render_template(:show)
138
+ expect(response).to render_template('identifiers/_identifier')
139
+ end
140
+
141
+ it 'must respond with correct content type' do
142
+ expect(response.content_type).to include 'application/json'
143
+ end
144
+ end
145
+
146
+ # Spree::Api::IdentifiersController#delete
147
+ describe 'DELETE /api/identifiers' do
148
+ let(:identifier) { create(:identifier ) }
149
+ let(:path) { "/api/identifiers/#{identifier.to_param}" }
150
+
151
+ before do
152
+ delete path, headers: headers
153
+ end
154
+
155
+ it { is_expected.to have_http_status(:no_content) }
156
+
157
+ it 'renders correct templates' do
158
+ expect(response).to render_template(nil)
159
+ end
160
+ end
161
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Spree::IdentifierKey, type: :model do
6
+ subject(:key) { instance }
7
+
8
+ let(:instance) { FactoryBot.build(:identifier_key) }
9
+
10
+ describe 'validations' do
11
+ it { is_expected.to be_valid }
12
+
13
+ it 'must be unique' do
14
+ name = 'my-key'
15
+
16
+ described_class.create!(name: name)
17
+ expect { described_class.create!(name: name) }.
18
+ to raise_error ActiveRecord::RecordInvalid
19
+ end
20
+ end
21
+ end