sunstone 5.0.1.3 → 5.0.1.4

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.
@@ -0,0 +1,37 @@
1
+ require 'test_helper'
2
+
3
+ class ActiveRecord::QueryFindTest < ActiveSupport::TestCase
4
+
5
+ schema do
6
+ create_table "ships", limit: 100 do |t|
7
+ t.string "name", limit: 255
8
+ end
9
+ end
10
+
11
+ class Ship < ActiveRecord::Base
12
+ end
13
+
14
+ test '::find' do
15
+ webmock(:get, "/ships", { where: {id: 42}, limit: 1 }).to_return({
16
+ body: [{id: 42}].to_json
17
+ })
18
+
19
+ assert_equal 42, Ship.find(42).id
20
+ end
21
+
22
+ test '::find_each' do
23
+ requests = []
24
+
25
+ requests << webmock(:get, "/ships", { limit: 100, offset: 0, order: [{id: :asc}] }).to_return({
26
+ body: Array.new(100, { id: 1 }).to_json
27
+ })
28
+ requests << webmock(:get, "/ships", { limit: 100, offset: 100, order: [{id: :asc}] }).to_return({
29
+ body: Array.new(10, { id: 2 }).to_json
30
+ })
31
+
32
+ assert_nil Ship.find_each { |s| s }
33
+
34
+ requests.each { |r| assert_requested(r) }
35
+ end
36
+
37
+ end
@@ -0,0 +1,79 @@
1
+ require 'test_helper'
2
+
3
+ class ActiveRecord::QueryWhereTest < ActiveSupport::TestCase
4
+
5
+ schema do
6
+ create_table "ships", limit: 100 do |t|
7
+ t.string "name", limit: 255
8
+ end
9
+
10
+ create_table "fleets" do |t|
11
+ t.string "name", limit: 255
12
+ t.integer "fleet_id"
13
+ end
14
+
15
+ create_table "sailors" do |t|
16
+ t.string "name", limit: 255
17
+ t.integer "ship_id"
18
+ end
19
+ end
20
+
21
+ class Fleet < ActiveRecord::Base
22
+ has_many :ships
23
+ end
24
+
25
+ class Ship < ActiveRecord::Base
26
+ belongs_to :fleet
27
+ has_many :sailors
28
+ end
29
+
30
+ class Sailor < ActiveRecord::Base
31
+ belongs_to :ship
32
+ end
33
+
34
+ test '::where on columns' do
35
+ webmock(:get, "/ships", { where: { id: 10 }, limit: 100, offset: 0 }).to_return(body: [].to_json)
36
+
37
+ assert_equal [], Ship.where(id: 10).to_a
38
+ end
39
+
40
+ test '::where column is nil' do
41
+ webmock(:get, "/ships", { where: { fleet_id: nil }, limit: 100, offset: 0 }).to_return(body: [].to_json)
42
+
43
+ assert_equal [], Ship.where(fleet_id: nil).to_a
44
+ end
45
+
46
+ test '::where on belongs_to relation' do
47
+ webmock(:get, "/ships", where: {fleet: { id: {eq: 1} } }, limit: 100, offset: 0).to_return(body: [].to_json)
48
+
49
+ assert_equal [], Ship.where(fleet: {id: 1}).to_a
50
+ end
51
+
52
+ test '::where on has_many relation' do
53
+ webmock(:get, "/fleets", where: {ships: { id: {eq: 1} } }).to_return(body: [].to_json)
54
+
55
+ assert_equal [], Fleet.where(ships: {id: 1}).to_a
56
+ end
57
+
58
+ test '::where on has_and_belongs_to_many relation' do
59
+ webmock(:get, "/ships", where: {sailors: { id: {eq: 1} } }, limit: 100, offset: 0).to_return(body: [].to_json)
60
+
61
+ assert_equal [], Ship.where(sailors: {id: 1}).to_a
62
+ end
63
+
64
+ # Polymorphic
65
+ test '::where on a has_many throught a polymorphic source' do
66
+ webmock(:get, "/ships", where: { nations: { id: {eq: 1} } }, limit: 10).to_return(body: [].to_json)
67
+
68
+ assert_equal [], Ship.where(nations: {id: 1}).limit(10).to_a
69
+ end
70
+ ### end polymorphic test
71
+
72
+ test '::where on nested relationship' do
73
+ webmock(:get, "/fleets", where: { ships: {sailors: { id: {eq: 1} } } }, limit: 10).to_return(body: [].to_json)
74
+
75
+ assert_equal [], Fleet.where(ships: {sailors: {id: 1}}).limit(10).to_a
76
+ end
77
+
78
+
79
+ end
@@ -1,135 +1,67 @@
1
1
  require 'test_helper'
2
2
 
3
- class ActiveRecord::QueryTest < Minitest::Test
3
+ class ActiveRecord::QueryTest < ActiveSupport::TestCase
4
4
 
5
- test '::find w/ old schema definition' do
6
- replaced_stub = WebMock::StubRegistry.instance.global_stubs.find { |x|
7
- x.request_pattern.uri_pattern.to_s == 'http://example.com/ships/schema'
8
- }
9
- WebMock::StubRegistry.instance.global_stubs.delete(replaced_stub)
10
-
11
- new_stub = WebMock::API.stub_request(:get, "http://example.com/ships/schema").to_return(
12
- body: {
13
- id: {type: 'integer', primary_key: true, null: false, array: false},
14
- fleet_id: {type: 'integer', primary_key: false, null: true, array: false},
15
- name: {type: 'string', primary_key: false, null: true, array: false}
16
- }.to_json
17
- )
18
-
19
- webmock(:get, "/ships", { where: {id: 42}, limit: 1 }).to_return(body: [{id: 42}].to_json)
20
-
21
- assert_equal 42, Ship.find(42).id
22
-
23
- WebMock::API.remove_request_stub(new_stub)
24
- WebMock::StubRegistry.instance.global_stubs.push(replaced_stub)
25
- end
26
-
27
- test '::all' do
28
- ships = []
29
- 101.times { |i| ships << Ship.new(id: i) }
30
- webmock(:get, "/ships", { limit: 100, offset: 0 }).to_return(body: ships[0..100].to_json)
31
- webmock(:get, "/ships", { limit: 100, offset: 100 }).to_return(body: ships[101..-1].to_json)
32
- assert_equal ships, Ship.all
5
+ schema do
6
+ create_table "ships", limit: 100 do |t|
7
+ t.string "name", limit: 255
8
+ end
9
+
10
+ create_table "ownerships" do |t|
11
+ t.string "asset_type"
12
+ t.integer "asset_id"
13
+ end
33
14
  end
34
15
 
35
- test '::all w/o resource_limit' do
36
- webmock(:get, "/fleets").to_return(body: [{id: 42}].to_json)
37
- assert_equal [Fleet.new(id: 42)], Fleet.all
16
+ class Ship < ActiveRecord::Base
17
+ has_many :ownerships, as: :asset
38
18
  end
39
-
40
- test '::find' do
41
- webmock(:get, "/ships", { where: {id: 42}, limit: 1 }).to_return(body: [{id: 42}].to_json)
42
-
43
- assert_equal 42, Ship.find(42).id
19
+
20
+ class Ownership < ActiveRecord::Base
21
+ belongs_to :asset, polymorphic: true
44
22
  end
45
-
23
+
46
24
  test '::first' do
47
- webmock(:get, "/ships", { limit: 1, order: [{id: :asc}] }).to_return(body: [].to_json)
25
+ webmock(:get, "/ships", { limit: 1, order: [{id: :asc}] }).to_return({
26
+ body: [].to_json
27
+ })
48
28
 
49
29
  assert_nil Ship.first
50
30
  end
51
31
 
52
32
  test '::last' do
53
- webmock(:get, "/ships", { limit: 1, order: [{id: :desc}] }).to_return(body: [].to_json)
33
+ webmock(:get, "/ships", { limit: 1, order: [{id: :desc}] }).to_return({
34
+ body: [].to_json
35
+ })
54
36
 
55
37
  assert_nil Ship.last
56
38
  end
57
-
58
- test '::find_each' do
59
- webmock(:get, "/ships", { limit: 100, offset: 0, order: [{id: :asc}] }).to_return(body: Array.new(100, { id: 1 }).to_json)
60
- webmock(:get, "/ships", { limit: 100, offset: 100, order: [{id: :asc}] }).to_return(body: Array.new(10, { id: 2 }).to_json)
61
-
62
- assert_nil Ship.find_each { |s| s }
63
- end
64
-
65
- test '::where on columns' do
66
- webmock(:get, "/ships", { where: { id: 10 }, limit: 100, offset: 0 }).to_return(body: [].to_json)
67
-
68
- assert_equal [], Ship.where(:id => 10).to_a
69
- end
70
-
71
- test '::where column is nil' do
72
- webmock(:get, "/ships", { where: { leased_at: nil }, limit: 100, offset: 0 }).to_return(body: [].to_json)
73
-
74
- assert_equal [], Ship.where(:leased_at => nil).to_a
39
+
40
+ test '::where(AND CONDITION)' do
41
+ webmock(:get, "/ships", { where: {id: 10, name: 'name'}, limit: 1, order: [{id: :asc}] }).to_return({
42
+ body: [{id: 42}].to_json
43
+ })
44
+
45
+ arel_table = Ship.arel_table
46
+ assert_equal 42, Ship.where(arel_table[:id].eq(10).and(arel_table[:name].eq('name'))).first.id
75
47
  end
48
+
49
+ test '::where(OR CONDITION)' do
50
+ webmock(:get, "/ships", { where: [{id: 10}, 'OR', {name: 'name'}], limit: 1, order: [{id: :asc}] }).to_return({
51
+ body: [{id: 42}].to_json
52
+ })
76
53
 
77
- test '::where on belongs_to relation' do
78
- webmock(:get, "/ships", where: {fleet: { id: {eq: 1} } }, limit: 100, offset: 0).to_return(body: [].to_json)
79
-
80
- assert_equal [], Ship.where(:fleet => {id: 1}).to_a
54
+ arel_table = Ship.arel_table
55
+ assert_equal 42, Ship.where(arel_table[:id].eq(10).or(arel_table[:name].eq('name'))).first.id
81
56
  end
82
57
 
83
- test '::where on has_many relation' do
84
- webmock(:get, "/fleets", where: {ships: { id: {eq: 1} } }).to_return(body: [].to_json)
58
+ test '::where(AND & OR CONDITION)' do
59
+ webmock(:get, "/ships", { where: [{id: 10}, 'AND', [{id: 10}, 'OR', {name: 'name'}]], limit: 1, order: [{id: :asc}] }).to_return({
60
+ body: [{id: 42}].to_json
61
+ })
85
62
 
86
- assert_equal [], Fleet.where(:ships => {id: 1}).to_a
87
- end
88
-
89
- test '::where on has_and_belongs_to_many relation' do
90
- webmock(:get, "/ships", where: {sailors: { id: {eq: 1} } }, limit: 100, offset: 0).to_return(body: [].to_json)
91
-
92
- assert_equal [], Ship.where(:sailors => {id: 1}).to_a
93
- end
94
-
95
- # Polymorphic
96
- test '::where on a has_many throught a polymorphic source' do
97
- webmock(:get, "/ships", where: { nations: { id: {eq: 1} } }, limit: 10).to_return(body: [].to_json)
98
-
99
- assert_equal [], Ship.where(nations: {id: 1}).limit(10).to_a
100
- end
101
- ### end polymorphic test
102
-
103
- # Distinct
104
- test '::distinct query' do
105
- webmock(:get, "/ships", distinct: true, limit: 100, offset: 0).to_return(body: [].to_json)
106
-
107
- assert_equal [], Ship.distinct
108
- end
109
-
110
- # TODO: i need arel-extensions....
111
- # test '::distinct_on query' do
112
- # webmock(:get, "/ships", distinct_on: ['id']).to_return(body: [].to_json)
113
- #
114
- # assert_equal [], Ship.distinct_on(:id)
115
- # end
116
-
117
- test '::count' do
118
- webmock(:get, "/ships/calculate", select: [{count: "*"}], limit: 100, offset: 0).to_return(body: [10].to_json)
119
-
120
- assert_equal 10, Ship.count
121
- end
122
-
123
- test '::count(:column)' do
124
- webmock(:get, "/ships/calculate", select: [{count: "id"}], limit: 100, offset: 0).to_return(body: [10].to_json)
125
-
126
- assert_equal 10, Ship.count(:id)
127
- end
128
-
129
- test '::sum(:column)' do
130
- webmock(:get, "/ships/calculate", select: [{sum: "weight"}], limit: 100, offset: 0).to_return(body: [10].to_json)
131
-
132
- assert_equal 10, Ship.sum(:weight)
63
+ arel_table = Ship.arel_table
64
+ assert_equal 42, Ship.where(arel_table[:id].eq(10).and(arel_table[:id].eq(10).or(arel_table[:name].eq('name')))).first.id
133
65
  end
134
66
 
135
67
  test '::where(....big get request turns into post...)' do
@@ -141,6 +73,15 @@ class ActiveRecord::QueryTest < Minitest::Test
141
73
 
142
74
  assert_equal 42, Ship.where(name: name)[0].id
143
75
  end
76
+
77
+ test '::where with JOIN' do
78
+ webmock(:get, "/ships", {where: { ownerships: {id: {eq: 1}} }, limit: 100, offset: 0 }).to_return({
79
+ body: [{id: 42}].to_json
80
+ })
81
+
82
+ arel = Ownership.arel_table[:id].eq(1)
83
+ assert_equal 42, Ship.joins(:ownerships).where(arel)[0].id
84
+ end
144
85
 
145
86
  # Relation test
146
87
 
@@ -149,7 +90,7 @@ class ActiveRecord::QueryTest < Minitest::Test
149
90
  end
150
91
 
151
92
  test '#to_sql binds correctly when joining' do
152
- assert_equal 'SELECT ships.* FROM ships INNER JOIN ownerships ON ownerships.asset_id = ships.id AND ownerships.asset_type = \'Ship\' WHERE ownerships.id = 1', Ship.joins(:ownerships).where({ ownerships: { id: 1 } }).to_sql
93
+ assert_equal 'SELECT ships.* FROM ships INNER JOIN ownerships ON ownerships.asset_id = ships.id AND ownerships.asset_type = \'ActiveRecord::QueryTest::Ship\' WHERE ownerships.id = 1', Ship.joins(:ownerships).where({ ownerships: { id: 1 } }).to_sql
153
94
  end
154
95
 
155
96
  test '#to_sar' do
@@ -0,0 +1,117 @@
1
+ class ActiveSupport::TestCase
2
+ class Schema
3
+
4
+ class Table
5
+
6
+ class Column
7
+
8
+ def initialize(name, type, options={})
9
+ @name = name
10
+ @type = type
11
+ @options = options
12
+ end
13
+
14
+ def as_json
15
+ {type: @type, primary_key: false, null: true, array: false}.merge(@options)
16
+ end
17
+ end
18
+
19
+ attr_accessor :name, :options, :columns
20
+
21
+ def initialize(name, options={}, &block)
22
+ @name = name
23
+ @options = options
24
+ @columns = {}
25
+ case options[:id]
26
+ when false
27
+ else
28
+ integer('id', primary_key: true, null: false)
29
+ end
30
+
31
+ block.call(self)
32
+ end
33
+
34
+ def string(name, options={})
35
+ @columns[name] = Column.new(name, :string, options)
36
+ end
37
+
38
+ def datetime(name, options={})
39
+ @columns[name] = Column.new(name, :datetime, options)
40
+ end
41
+
42
+ def integer(name, options={})
43
+ @columns[name] = Column.new(name, :integer, options)
44
+ end
45
+
46
+ def to_json
47
+ json = @options.slice(:limit)
48
+ json[:columns] = {}
49
+ @columns.each do |name, column|
50
+ json[:columns][name] = column.as_json
51
+ end
52
+ json.to_json
53
+ end
54
+
55
+ end
56
+
57
+ attr_accessor :tables
58
+
59
+ def initialize
60
+ @tables = {}
61
+ end
62
+
63
+ def self.define(&block)
64
+ i = new
65
+ i.define(&block)
66
+ i
67
+ end
68
+
69
+ def define(&block)
70
+ instance_eval(&block)
71
+ end
72
+
73
+ def create_table(name, options={}, &block)
74
+ @tables[name] = Table.new(name, options, &block)
75
+ end
76
+
77
+ end
78
+
79
+ def self.schema(&block)
80
+ self.class_variable_set(:@@schema, Schema.define(&block))
81
+ end
82
+
83
+ set_callback(:setup, :before) do
84
+ if !instance_variable_defined?(:@suite_setup_run) && self.class.class_variable_defined?(:@@schema)
85
+ ActiveRecord::Base.establish_connection(adapter: 'sunstone', url: 'http://example.com')
86
+
87
+ req_stub = stub_request(:get, /^http:\/\/example.com/).with do |req|
88
+ case req.uri.path
89
+ when '/tables'
90
+ true
91
+ when /^\/\w+\/schema$/i
92
+ true
93
+ else
94
+ false
95
+ end
96
+ end
97
+
98
+ req_stub.to_return do |req|
99
+ case req.uri.path
100
+ when '/tables'
101
+ {
102
+ body: self.class.class_variable_get(:@@schema).tables.keys.to_json,
103
+ headers: { 'StandardAPI-Version' => '5.0.0.5' }
104
+ }
105
+ when /^\/(\w+)\/schema$/i
106
+ {
107
+ body: self.class.class_variable_get(:@@schema).tables[$1].to_json,
108
+ headers: { 'StandardAPI-Version' => '5.0.0.5' }
109
+ }
110
+ end
111
+ end
112
+
113
+ end
114
+ @suite_setup_run = true
115
+ end
116
+
117
+ end
@@ -1,6 +1,6 @@
1
1
  require 'test_helper'
2
2
 
3
- class Sunstone::Connection::ConfigurationTest < Minitest::Test
3
+ class Sunstone::Connection::ConfigurationTest < ActiveSupport::TestCase
4
4
 
5
5
  test "setting the url sets the api_key" do
6
6
  connection = Sunstone::Connection.new(url: 'http://my_api_key@localhost')
@@ -1,6 +1,6 @@
1
1
  require 'test_helper'
2
2
 
3
- class Sunstone::Connection::CookieStoreTest < Minitest::Test
3
+ class Sunstone::Connection::CookieStoreTest < ActiveSupport::TestCase
4
4
 
5
5
  test '#send_request(#<Net::HTTPRequest) adds cookies to the cookie store if present' do
6
6
  store = CookieStore::HashStore.new