sunstone 6.1.0.2 → 7.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/ext/active_record/associations/collection_association.rb +1 -1
  3. data/ext/active_record/attribute_methods.rb +7 -1
  4. data/ext/active_record/finder_methods.rb +14 -13
  5. data/ext/active_record/persistence.rb +6 -3
  6. data/ext/active_record/relation/calculations.rb +11 -4
  7. data/ext/active_record/relation/query_methods.rb +1 -1
  8. data/ext/active_record/statement_cache.rb +0 -1
  9. data/ext/arel/nodes/select_statement.rb +3 -3
  10. data/lib/active_record/connection_adapters/sunstone/column.rb +1 -1
  11. data/lib/active_record/connection_adapters/sunstone/database_statements.rb +8 -9
  12. data/lib/active_record/connection_adapters/sunstone/schema_statements.rb +31 -14
  13. data/lib/active_record/connection_adapters/sunstone_adapter.rb +17 -7
  14. data/lib/arel/collectors/sunstone.rb +25 -4
  15. data/lib/arel/visitors/sunstone.rb +21 -26
  16. data/lib/sunstone/connection.rb +40 -13
  17. data/lib/sunstone/version.rb +1 -1
  18. metadata +21 -61
  19. data/.github/workflows/main.yml +0 -141
  20. data/.gitignore +0 -31
  21. data/.tm_properties +0 -1
  22. data/Gemfile +0 -4
  23. data/README.md +0 -46
  24. data/Rakefile +0 -37
  25. data/TODO.md +0 -89
  26. data/sunstone.gemspec +0 -40
  27. data/test/active_record/associations/belongs_to_test.rb +0 -162
  28. data/test/active_record/associations/has_and_belongs_to_many_test.rb +0 -125
  29. data/test/active_record/associations/has_many_test.rb +0 -244
  30. data/test/active_record/eager_loading_test.rb +0 -62
  31. data/test/active_record/persistance_test.rb +0 -184
  32. data/test/active_record/preload_test.rb +0 -51
  33. data/test/active_record/query/all_test.rb +0 -33
  34. data/test/active_record/query/count_test.rb +0 -51
  35. data/test/active_record/query/distinct_test.rb +0 -30
  36. data/test/active_record/query/find_test.rb +0 -37
  37. data/test/active_record/query/limit_test.rb +0 -19
  38. data/test/active_record/query/order_test.rb +0 -27
  39. data/test/active_record/query/where_test.rb +0 -79
  40. data/test/active_record/query_test.rb +0 -131
  41. data/test/active_record/rpc_test.rb +0 -30
  42. data/test/schema_mock.rb +0 -121
  43. data/test/sunstone/connection/column_definition_test.rb +0 -30
  44. data/test/sunstone/connection/configuration_test.rb +0 -44
  45. data/test/sunstone/connection/cookie_store_test.rb +0 -37
  46. data/test/sunstone/connection/request_helper_test.rb +0 -105
  47. data/test/sunstone/connection/send_request_test.rb +0 -164
  48. data/test/sunstone/connection_test.rb +0 -23
  49. data/test/test_helper.rb +0 -153
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sunstone
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.1.0.2
4
+ version: 7.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jon Bracy
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-03-23 00:00:00.000000000 Z
11
+ date: 2022-12-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -184,14 +184,14 @@ dependencies:
184
184
  requirements:
185
185
  - - ">="
186
186
  - !ruby/object:Gem::Version
187
- version: 6.1.0
187
+ version: 7.0.0
188
188
  type: :development
189
189
  prerelease: false
190
190
  version_requirements: !ruby/object:Gem::Requirement
191
191
  requirements:
192
192
  - - ">="
193
193
  - !ruby/object:Gem::Version
194
- version: 6.1.0
194
+ version: 7.0.0
195
195
  - !ruby/object:Gem::Dependency
196
196
  name: msgpack
197
197
  requirement: !ruby/object:Gem::Requirement
@@ -222,6 +222,20 @@ dependencies:
222
222
  version: '0'
223
223
  - !ruby/object:Gem::Dependency
224
224
  name: activerecord
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - ">="
228
+ - !ruby/object:Gem::Version
229
+ version: 7.0.0
230
+ type: :runtime
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - ">="
235
+ - !ruby/object:Gem::Version
236
+ version: 7.0.0
237
+ - !ruby/object:Gem::Dependency
238
+ name: arel-extensions
225
239
  requirement: !ruby/object:Gem::Requirement
226
240
  requirements:
227
241
  - - ">="
@@ -235,7 +249,7 @@ dependencies:
235
249
  - !ruby/object:Gem::Version
236
250
  version: 6.1.0
237
251
  - !ruby/object:Gem::Dependency
238
- name: arel-extensions
252
+ name: activerecord-filter
239
253
  requirement: !ruby/object:Gem::Requirement
240
254
  requirements:
241
255
  - - ">="
@@ -255,14 +269,7 @@ executables: []
255
269
  extensions: []
256
270
  extra_rdoc_files: []
257
271
  files:
258
- - ".github/workflows/main.yml"
259
- - ".gitignore"
260
- - ".tm_properties"
261
- - Gemfile
262
272
  - LICENSE
263
- - README.md
264
- - Rakefile
265
- - TODO.md
266
273
  - ext/active_record/associations.rb
267
274
  - ext/active_record/associations/collection_association.rb
268
275
  - ext/active_record/attribute_methods.rb
@@ -298,30 +305,6 @@ files:
298
305
  - lib/sunstone/exception.rb
299
306
  - lib/sunstone/gis.rb
300
307
  - lib/sunstone/version.rb
301
- - sunstone.gemspec
302
- - test/active_record/associations/belongs_to_test.rb
303
- - test/active_record/associations/has_and_belongs_to_many_test.rb
304
- - test/active_record/associations/has_many_test.rb
305
- - test/active_record/eager_loading_test.rb
306
- - test/active_record/persistance_test.rb
307
- - test/active_record/preload_test.rb
308
- - test/active_record/query/all_test.rb
309
- - test/active_record/query/count_test.rb
310
- - test/active_record/query/distinct_test.rb
311
- - test/active_record/query/find_test.rb
312
- - test/active_record/query/limit_test.rb
313
- - test/active_record/query/order_test.rb
314
- - test/active_record/query/where_test.rb
315
- - test/active_record/query_test.rb
316
- - test/active_record/rpc_test.rb
317
- - test/schema_mock.rb
318
- - test/sunstone/connection/column_definition_test.rb
319
- - test/sunstone/connection/configuration_test.rb
320
- - test/sunstone/connection/cookie_store_test.rb
321
- - test/sunstone/connection/request_helper_test.rb
322
- - test/sunstone/connection/send_request_test.rb
323
- - test/sunstone/connection_test.rb
324
- - test/test_helper.rb
325
308
  homepage: http://sunstonerb.com
326
309
  licenses: []
327
310
  metadata: {}
@@ -340,31 +323,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
340
323
  - !ruby/object:Gem::Version
341
324
  version: '0'
342
325
  requirements: []
343
- rubygems_version: 3.2.3
326
+ rubygems_version: 3.2.22
344
327
  signing_key:
345
328
  specification_version: 4
346
329
  summary: A library for interacting with REST APIs
347
- test_files:
348
- - test/active_record/associations/belongs_to_test.rb
349
- - test/active_record/associations/has_and_belongs_to_many_test.rb
350
- - test/active_record/associations/has_many_test.rb
351
- - test/active_record/eager_loading_test.rb
352
- - test/active_record/persistance_test.rb
353
- - test/active_record/preload_test.rb
354
- - test/active_record/query/all_test.rb
355
- - test/active_record/query/count_test.rb
356
- - test/active_record/query/distinct_test.rb
357
- - test/active_record/query/find_test.rb
358
- - test/active_record/query/limit_test.rb
359
- - test/active_record/query/order_test.rb
360
- - test/active_record/query/where_test.rb
361
- - test/active_record/query_test.rb
362
- - test/active_record/rpc_test.rb
363
- - test/schema_mock.rb
364
- - test/sunstone/connection/column_definition_test.rb
365
- - test/sunstone/connection/configuration_test.rb
366
- - test/sunstone/connection/cookie_store_test.rb
367
- - test/sunstone/connection/request_helper_test.rb
368
- - test/sunstone/connection/send_request_test.rb
369
- - test/sunstone/connection_test.rb
370
- - test/test_helper.rb
330
+ test_files: []
@@ -1,141 +0,0 @@
1
- name: CI
2
-
3
- on:
4
- push:
5
- branches: [ master ]
6
- pull_request:
7
- branches: [ master ]
8
-
9
- jobs:
10
- sunstone:
11
- name: Sunstone Test
12
- runs-on: ubuntu-20.04
13
-
14
- steps:
15
- - uses: ruby/setup-ruby@v1
16
- with:
17
- ruby-version: 3.0
18
-
19
- - uses: actions/checkout@v2
20
-
21
- - run: bundle
22
-
23
- - run: bundle exec rake test
24
-
25
- ar-postgresql:
26
- name: ActiveRecord PostgresQL Test
27
- strategy:
28
- matrix:
29
- rails: [v6.1.3]
30
-
31
- runs-on: ubuntu-20.04
32
-
33
- steps:
34
- - name: Install Postgresql
35
- run: |
36
- sudo apt-get install curl ca-certificates gnupg
37
- curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
38
- sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
39
- sudo apt-get update
40
- sudo apt-get install postgresql-13
41
- sudo systemctl start postgresql@13-main.service
42
- sudo -u postgres createuser runner --superuser
43
-
44
- - uses: ruby/setup-ruby@v1
45
- with:
46
- ruby-version: 3.0
47
-
48
- - uses: actions/checkout@v2
49
-
50
- - name: Download Rails
51
- run: |
52
- git clone --branch ${{ matrix.rails }} https://github.com/rails/rails.git ~/rails
53
- pushd ~/rails
54
- cat /home/runner/work/_temp/*.sh
55
- sed -i "s/Gem.ruby, '-w'/Gem.ruby, '-w0'/" ~/rails/activerecord/Rakefile
56
- sed -i "s/t.warning = true/t.warning = false/g" ~/rails/activerecord/Rakefile
57
- sed -i "/require 'support\/connection'/a \$LOAD_PATH.unshift\(File.expand_path\(ENV['GITHUB_WORKSPACE']\)\)\nrequire 'sunstone'" ~/rails/activerecord/test/cases/helper.rb
58
- rm ~/rails/Gemfile.lock
59
- sed -i "/# Active Record./a gem 'sunstone', path: File.expand_path\(ENV['GITHUB_WORKSPACE']\)" ~/rails/Gemfile
60
- cat ~/rails/Gemfile
61
- bundle update --jobs=3 --retry=3
62
-
63
- - run: |
64
- pushd ~/rails/activerecord
65
- bundle exec rake db:postgresql:rebuild postgresql:test
66
- bundle exec rake db:postgresql:rebuild postgresql:isolated_test
67
-
68
- ar-sqlite:
69
- name: ActiveRecord SQLite Test
70
- strategy:
71
- matrix:
72
- rails: [v6.1.3]
73
-
74
- runs-on: ubuntu-20.04
75
-
76
- steps:
77
- - uses: ruby/setup-ruby@v1
78
- with:
79
- ruby-version: 3.0
80
-
81
- - uses: actions/checkout@v2
82
-
83
- - name: Download Rails
84
- run: |
85
- git clone --branch ${{ matrix.rails }} https://github.com/rails/rails.git ~/rails
86
- pushd ~/rails
87
- cat /home/runner/work/_temp/*.sh
88
- sed -i "s/Gem.ruby, '-w'/Gem.ruby, '-w0'/" ~/rails/activerecord/Rakefile
89
- sed -i "s/t.warning = true/t.warning = false/g" ~/rails/activerecord/Rakefile
90
- sed -i "/require 'support\/connection'/a \$LOAD_PATH.unshift\(File.expand_path\(ENV['GITHUB_WORKSPACE']\)\)\nrequire 'sunstone'" ~/rails/activerecord/test/cases/helper.rb
91
- rm ~/rails/Gemfile.lock
92
- sed -i "/# Active Record./a gem 'sunstone', path: File.expand_path\(ENV['GITHUB_WORKSPACE']\)" ~/rails/Gemfile
93
- cat ~/rails/Gemfile
94
- bundle update --jobs=3 --retry=3
95
-
96
- - run: |
97
- pushd ~/rails/activerecord
98
- bundle exec rake sqlite3:test
99
- rm test/db/*.sqlite3 test/fixtures/*.sqlite3
100
- bundle exec rake sqlite3:isolated_test
101
- rm test/db/*.sqlite3 test/fixtures/*.sqlite3
102
- bundle exec rake sqlite3_mem:test
103
-
104
- ar-mysql:
105
- name: ActiveRecord MySQL Test
106
- strategy:
107
- matrix:
108
- rails: [v6.1.3]
109
-
110
- runs-on: ubuntu-20.04
111
-
112
- steps:
113
- - name: Install MySQL
114
- run: |
115
- sudo /etc/init.d/mysql start
116
- mysql -uroot -proot -e "CREATE USER 'rails'@'%';"
117
- mysql -uroot -proot -e "GRANT ALL PRIVILEGES ON *.* TO 'rails'@'%' WITH GRANT OPTION;"
118
-
119
- - uses: ruby/setup-ruby@v1
120
- with:
121
- ruby-version: 3.0
122
-
123
- - uses: actions/checkout@v2
124
-
125
- - name: Download Rails
126
- run: |
127
- git clone --branch ${{ matrix.rails }} https://github.com/rails/rails.git ~/rails
128
- pushd ~/rails
129
- cat /home/runner/work/_temp/*.sh
130
- sed -i "s/Gem.ruby, '-w'/Gem.ruby, '-w0'/" ~/rails/activerecord/Rakefile
131
- sed -i "s/t.warning = true/t.warning = false/g" ~/rails/activerecord/Rakefile
132
- sed -i "/require 'support\/connection'/a \$LOAD_PATH.unshift\(File.expand_path\(ENV['GITHUB_WORKSPACE']\)\)\nrequire 'sunstone'" ~/rails/activerecord/test/cases/helper.rb
133
- rm ~/rails/Gemfile.lock
134
- sed -i "/# Active Record./a gem 'sunstone', path: File.expand_path\(ENV['GITHUB_WORKSPACE']\)" ~/rails/Gemfile
135
- cat ~/rails/Gemfile
136
- bundle update --jobs=3 --retry=3
137
-
138
- - run: |
139
- pushd ~/rails/activerecord
140
- bundle exec rake db:mysql:rebuild mysql2:test
141
- bundle exec rake db:mysql:rebuild mysql2:isolated_test
data/.gitignore DELETED
@@ -1,31 +0,0 @@
1
- *.gem
2
- *.rbc
3
- /.config
4
- /coverage/
5
- /InstalledFiles
6
- /pkg/
7
- /spec/reports/
8
- /test/tmp/
9
- /test/version_tmp/
10
- /tmp/
11
- .DS_Store
12
-
13
- ## Documentation cache and generated files:
14
- /.yardoc/
15
- /_yardoc/
16
- /doc/
17
- /rdoc/
18
-
19
- ## Environment normalisation:
20
- /.bundle/
21
- /lib/bundler/man/
22
-
23
- # for a library or gem, you might want to ignore these files since the code is
24
- # intended to run in multiple environments; otherwise, check them in:
25
- Gemfile.lock
26
- .ruby-version
27
- .ruby-gemset
28
-
29
- # Text Editor scraps
30
- *~
31
- .byebug_history
data/.tm_properties DELETED
@@ -1 +0,0 @@
1
- exclude = '{$exclude,log,bin,tmp,.tm_properties,coverage}'
data/Gemfile DELETED
@@ -1,4 +0,0 @@
1
- source "http://rubygems.org"
2
-
3
- # Specify your gem's dependencies in sunstone.gemspec
4
- gemspec
data/README.md DELETED
@@ -1,46 +0,0 @@
1
- # Sunstone
2
-
3
- Sunstone is an [ActiveRecord](https://rubygems.org/gems/activerecord) adapter for quering
4
- APIs conforming to [Standard API](https://github.com/waratuman/standardapi).
5
-
6
- Configuration
7
- -------------
8
-
9
- ### Rails
10
-
11
- Add `sunstone` to your Gemfile:
12
-
13
- ```ruby
14
- gem 'sunstone'
15
- ```
16
-
17
- Update `config/database.yml`"
18
-
19
- ```yaml
20
- development:
21
- adapter: sunstone
22
- url: https://mystanda.rd/api
23
- api_key: ..optional..
24
- user_agent: ..optional..
25
- ```
26
-
27
- ### Standalone ActiveRecord
28
-
29
- Initialize the connection on `ActiveRecord::Base` or your abstract model (`ApplicationRecord` for example)
30
-
31
- ```ruby
32
- ActiveRecord::Base.establish_connection(
33
- adapter: 'sunstone',
34
- url: 'https://mystanda.rd/api'
35
- )
36
- ```
37
-
38
- Usage
39
- -----
40
-
41
- Mention fitler / etc...
42
-
43
- TODO:
44
- =====
45
- Make `cookie_store` and optional
46
- stream building model instances with wankel
data/Rakefile DELETED
@@ -1,37 +0,0 @@
1
- require 'bundler/setup'
2
- require "bundler/gem_tasks"
3
- Bundler.require(:development)
4
- require 'rake/testtask'
5
- require 'rdoc/task'
6
-
7
- task :console do
8
- exec 'irb -I lib -r sunstone.rb'
9
- end
10
- task :c => :console
11
-
12
- Rake::TestTask.new do |t|
13
- t.libs << 'test'
14
- t.test_files = FileList['test/**/*_test.rb']
15
- t.warning = true
16
- #t.verbose = true
17
- end
18
-
19
- Rake::RDocTask.new do |rd|
20
- rd.main = 'README.md'
21
- rd.title = 'Sunstone Documentation'
22
- rd.rdoc_dir = 'doc'
23
-
24
- rd.options << '-f' << 'sdoc'
25
- rd.options << '-T' << '42floors'
26
- rd.options << '-g' # Generate github links
27
-
28
- rd.rdoc_files.include('README.rdoc')
29
- rd.rdoc_files.include('lib/**/*.rb')
30
- end
31
-
32
- desc "Run tests"
33
- task :default => :test
34
-
35
- namespace :pages do
36
- #TODO: https://github.com/defunkt/sdoc-helpers/blob/master/lib/sdoc_helpers/pages.rb
37
- end
data/TODO.md DELETED
@@ -1,89 +0,0 @@
1
- - Check if `Sunstone#to_key` needs to be added
2
-
3
- - Add `Sunstone::Model::Persistance` with the following methods:
4
-
5
- - `#new_record?`
6
- - `#persisted?`
7
- - `#save`
8
- - `#save!`
9
- - `#update`
10
- - `#update!`
11
- - `#create`
12
- - `#to_param` ?
13
- - `::all`
14
- - `::where` (probably goes in an Arel like engine)
15
- - `::build`
16
- - `::create!`
17
- - `#==`
18
- - `::create`
19
-
20
- ```ruby
21
- # Creates an object and saves it to the MLS. The resulting object is returned
22
- # whether or no the object was saved successfully to the MLS or not.
23
- #
24
- # ==== Examples
25
- # #!ruby
26
- # # Create a single new object
27
- # User.create(:first_name => 'Jamie')
28
- #
29
- # # Create a single object and pass it into a block to set other attributes.
30
- # User.create(:first_name => 'Jamie') do |u|
31
- # u.is_admin = false
32
- # end
33
- def self.create(attributes={}, &block) # TODO: testme
34
- model = self.new(attributes)
35
- yield(model) if block_given?
36
- model.save
37
- model
38
- end
39
-
40
-
41
- - Look at https://gist.github.com/malomalo/91f360fe52db3dbe1c99 files for inspiration, came from
42
- Rails code I think
43
-
44
- - Simplify `Sunstone::Type::Value` to `Sunstone::Type`
45
-
46
- - Add a `find_class(type)` in `Sunstone::Schema`
47
-
48
- - Possibly use Classes to hold information about each attribute in addition to the type
49
-
50
- ```ruby
51
- class MLS::Attribute
52
-
53
- DEFAULT_OPTIONS = { :serialize => true }
54
-
55
- attr_reader :model, :name, :instance_variable_name, :options, :default
56
- attr_reader :reader_visibility, :writer_visibility
57
-
58
- def initialize(name, options={})
59
- @name = name
60
- @instance_variable_name = "@#{@name}".freeze
61
- @options = DEFAULT_OPTIONS.merge(options)
62
-
63
- @default = @options[:default]
64
- @reader_visibility = @options[:reader] || :public
65
- @writer_visibility = @options[:writer] || :public
66
- end
67
- end
68
- ```
69
-
70
- - Use Association classes to model the association:
71
-
72
- ```ruby
73
- class MLS::Association
74
- class BelongsTo
75
- attr_reader :klass, :foreign_key, :foreign_type, :primary_key, :polymorphic
76
-
77
- def initialize(name, options={})
78
- @name = name
79
- @klass = options[:class_name] ? options[:class_name].constantize : name.camelize.constantize
80
-
81
- @polymorphic = options[:polymorphic] || false
82
- @foreign_key = options[:foreign_key] || "#{name}_id".to_sym
83
- @foreign_type = options[:foreign_type] || "#{name}_type".to_sym
84
- @primary_key = options[:primary_key] || :id
85
- end
86
- end
87
-
88
- end
89
- ```
data/sunstone.gemspec DELETED
@@ -1,40 +0,0 @@
1
- require File.expand_path("../lib/sunstone/version", __FILE__)
2
-
3
- Gem::Specification.new do |s|
4
- s.name = "sunstone"
5
- s.version = Sunstone::VERSION
6
- s.authors = ["Jon Bracy"]
7
- s.email = ["jonbracy@gmail.com"]
8
- s.homepage = "http://sunstonerb.com"
9
- s.summary = %q{A library for interacting with REST APIs}
10
- s.description = %q{A library for interacting with REST APIs. Similar to ActiveResource}
11
-
12
- s.files = `git ls-files`.split("\n")
13
- s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
14
- s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
15
- s.require_paths = ["lib"]
16
- s.required_ruby_version = '>= 2.6'
17
-
18
- # Developoment
19
- s.add_development_dependency 'rake'
20
- s.add_development_dependency 'rdoc'
21
- # s.add_development_dependency 'sdoc'
22
- s.add_development_dependency 'bundler'
23
- s.add_development_dependency 'minitest'
24
- s.add_development_dependency 'minitest-reporters'
25
- s.add_development_dependency 'mocha'
26
- s.add_development_dependency 'faker'
27
- s.add_development_dependency 'factory_bot'
28
- s.add_development_dependency 'webmock'
29
- #s.add_development_dependency 'sdoc-templates-42floors'
30
- s.add_development_dependency 'rgeo'
31
- s.add_development_dependency 'simplecov'
32
- s.add_development_dependency 'byebug'
33
- s.add_development_dependency 'activesupport', '>= 6.1.0'
34
-
35
- # Runtime
36
- s.add_runtime_dependency 'msgpack'
37
- s.add_runtime_dependency 'cookie_store'
38
- s.add_runtime_dependency 'activerecord', '>= 6.1.0'
39
- s.add_runtime_dependency 'arel-extensions', '>= 6.1.0'
40
- end
@@ -1,162 +0,0 @@
1
- require 'test_helper'
2
-
3
- class ActiveRecord::Associations::BelongsToTest < ActiveSupport::TestCase
4
-
5
- schema do
6
- create_table "ships" do |t|
7
- t.string "name", limit: 255
8
- t.integer "fleet_id"
9
- end
10
-
11
- create_table "fleets" do |t|
12
- t.string "name", limit: 255
13
- end
14
- end
15
-
16
- class Fleet < ActiveRecord::Base
17
- has_many :ships
18
- end
19
-
20
- class Ship < ActiveRecord::Base
21
- belongs_to :fleet
22
- end
23
-
24
- # Save includes =============================================================
25
-
26
- test '#save new record includes new belongs_to associations' do
27
- ship = Ship.new(name: 'Definant', fleet: Fleet.new(name: 'Armada Duo'))
28
-
29
- req_stub = webmock(:post, '/ships', {include: :fleet}).with(
30
- body: {
31
- ship: { name: 'Definant', fleet_attributes: { name: 'Armada Duo' } }
32
- }.to_json
33
- ).to_return(
34
- body: {
35
- id: 2,
36
- fleet_id: 3,
37
- name: 'Definant 001',
38
- fleet: { id: 3, name: 'Armada 2' }
39
- }.to_json
40
- )
41
-
42
- assert ship.save
43
- assert_equal 2, ship.id
44
- assert_equal 3, ship.fleet_id
45
- assert_equal 3, ship.fleet.id
46
- assert_equal 'Definant 001', ship.name
47
- assert_equal 'Armada 2', ship.fleet.name
48
-
49
- assert_requested req_stub
50
- end
51
-
52
- test '#save new record doesnt include persisted/unmodified belongs_to associations' do
53
- webmock(:get, "/fleets", where: {id: 1}, limit: 1).to_return(
54
- body: [{id: 1, name: 'Armada Original'}].to_json
55
- )
56
-
57
- fleet = Fleet.find(1)
58
- ship = Ship.new(name: 'Definant', fleet: fleet)
59
-
60
- req_stub = webmock(:post, '/ships').with(
61
- body: {
62
- ship: { name: 'Definant', fleet_id: 1 }
63
- }.to_json
64
- ).to_return(
65
- body: {
66
- id: 2,
67
- fleet_id: 1,
68
- name: 'Definant 001'
69
- }.to_json
70
- )
71
-
72
- assert ship.save
73
- assert_equal 2, ship.id
74
- assert_equal 1, ship.fleet_id
75
-
76
- assert_requested req_stub
77
- end
78
-
79
- test '#save persisted record includes new belongs_to associations' do
80
- webmock(:get, "/ships", where: {id: 1}, limit: 1).to_return(
81
- body: [{id: 1, fleet_id: nil, name: 'Ship Uno'}].to_json
82
- )
83
-
84
- req_stub = webmock(:patch, '/ships/1', {include: :fleet}).with(
85
- body: {
86
- ship: { fleet_attributes: { name: 'Armada Duo' } }
87
- }.to_json
88
- ).to_return(
89
- body: {
90
- id: 1, fleet_id: 2, name: 'Ship Uno',
91
- fleet: { id: 2, name: 'Armada Duo' }
92
- }.to_json
93
- )
94
-
95
- ship = Ship.find(1)
96
- ship.fleet = Fleet.new(name: 'Armada Duo')
97
-
98
- ship.save
99
-
100
- assert_requested req_stub
101
- end
102
-
103
- test '#save persisted record doesnt include persisted/unmodified belongs_to associations but updates belongs_to key' do
104
- webmock(:get, "/ships", where: {id: 1}, limit: 1).to_return(
105
- body: [{id: 1, fleet_id: nil, name: 'Ship Uno'}].to_json
106
- )
107
- webmock(:get, "/fleets", where: {id: 1}, limit: 1).to_return(
108
- body: [{id: 1, name: 'Armada Original'}].to_json
109
- )
110
-
111
- fleet = Fleet.find(1)
112
- ship = Ship.find(1)
113
-
114
- req_stub = webmock(:patch, '/ships/1').with(
115
- body: {
116
- ship: { fleet_id: 1 }
117
- }.to_json
118
- ).to_return(
119
- body: {
120
- id: 1,
121
- fleet_id: 1,
122
- name: 'My Ship'
123
- }.to_json
124
- )
125
-
126
- ship.fleet = fleet
127
- assert ship.save
128
- assert_equal 1, ship.id
129
- assert_equal 1, ship.fleet_id
130
- assert_equal 'My Ship', ship.name
131
-
132
- assert_requested req_stub
133
- end
134
-
135
- test '#save persisted record doesnt include loaded belongs_to association' do
136
- webmock(:get, "/ships", where: {id: 1}, limit: 1, include: [:fleet]).to_return(
137
- body: [{id: 1, fleet_id: 1, name: 'Ship Uno', fleet: {id: 1, name: 'Armada Original'}}].to_json
138
- )
139
-
140
- ship = Ship.eager_load(:fleet).find(1)
141
-
142
- req_stub = webmock(:patch, '/ships/1').with(
143
- body: {
144
- ship: { name: 'New NAME!!' }
145
- }.to_json
146
- ).to_return(
147
- body: {
148
- id: 1,
149
- fleet_id: 1,
150
- name: 'New NAME!!'
151
- }.to_json
152
- )
153
-
154
-
155
- assert ship.association(:fleet).loaded?
156
- ship.name = 'New NAME!!'
157
- assert ship.save
158
-
159
- assert_requested req_stub
160
- end
161
-
162
- end