solidus_identifiers 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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