rom-http 0.0.1

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,25 @@
1
+ module ROM
2
+ module HTTP
3
+ class Relation < ROM::Relation
4
+ include Enumerable
5
+
6
+ adapter :http
7
+
8
+ forward :with_request_method, :with_path, :append_path, :with_options,
9
+ :with_params, :clear_params
10
+
11
+ def insert(*args)
12
+ dataset.insert(*args)
13
+ end
14
+ alias_method :<<, :insert
15
+
16
+ def update(*args)
17
+ dataset.update(*args)
18
+ end
19
+
20
+ def delete
21
+ dataset.delete
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,5 @@
1
+ module ROM
2
+ module HTTP
3
+ VERSION = '0.0.1'.freeze
4
+ end
5
+ end
@@ -0,0 +1,18 @@
1
+ begin
2
+ require 'rubocop/rake_task'
3
+
4
+ Rake::Task[:default].enhance [:rubocop]
5
+
6
+ RuboCop::RakeTask.new do |task|
7
+ task.options << '--display-cop-names'
8
+ end
9
+
10
+ namespace :rubocop do
11
+ desc 'Generate a configuration file acting as a TODO list.'
12
+ task :auto_gen_config do
13
+ exec 'bundle exec rubocop --auto-gen-config'
14
+ end
15
+ end
16
+
17
+ rescue LoadError
18
+ end
data/rom-http.gemspec ADDED
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'rom/http/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'rom-http'
8
+ spec.version = ROM::HTTP::VERSION.dup
9
+ spec.authors = ['Piotr Solnica', 'Andy Holland']
10
+ spec.email = ['piotr.solnica@gmail.com', 'andyholland1991@aol.com']
11
+ spec.summary = 'HTTP support for ROM'
12
+ spec.description = spec.summary
13
+ spec.homepage = 'http://rom-rb.org'
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ['lib']
20
+
21
+ spec.add_runtime_dependency 'rom', '0.9.0.beta1'
22
+ spec.add_runtime_dependency 'equalizer', '~> 0.0', '>= 0.0.9'
23
+ spec.add_runtime_dependency 'thread_safe'
24
+
25
+ spec.add_development_dependency 'bundler'
26
+ spec.add_development_dependency 'rspec', '~> 3.1'
27
+ spec.add_development_dependency 'rake', '~> 10.0'
28
+ end
@@ -0,0 +1,126 @@
1
+ RSpec.describe ROM::HTTP::Commands::Create do
2
+ let(:uri) { 'http://localhost:3000' }
3
+ let(:headers) { { accept: 'application/json' } }
4
+ let(:rom) { ROM::Environment.new }
5
+ let(:container) { rom.finalize.env }
6
+ let(:request_handler) { double(Proc) }
7
+ let(:response_handler) { double(Proc) }
8
+ let(:relation) do
9
+ Class.new(ROM::HTTP::Relation) do
10
+ dataset :users
11
+ end
12
+ end
13
+
14
+ before do
15
+ rom.setup(
16
+ :http,
17
+ uri: uri,
18
+ headers: headers,
19
+ request_handler: request_handler,
20
+ response_handler: response_handler
21
+ )
22
+ end
23
+
24
+ context 'with single tuple' do
25
+ let(:response) { double }
26
+ let(:tuple) { double }
27
+ let(:attributes) { { first_name: 'John', last_name: 'Jackson' } }
28
+ let(:command) do
29
+ Class.new(ROM::HTTP::Commands::Create) do
30
+ register_as :create
31
+ relation :users
32
+ result :one
33
+ end
34
+ end
35
+ let(:dataset) do
36
+ ROM::HTTP::Dataset.new(
37
+ {
38
+ uri: uri,
39
+ headers: headers,
40
+ request_handler: request_handler,
41
+ response_handler: response_handler,
42
+ name: :users
43
+ },
44
+ request_method: :post,
45
+ params: attributes
46
+ )
47
+ end
48
+
49
+ before do
50
+ rom.register_relation(relation)
51
+ rom.register_command(command)
52
+
53
+ allow(request_handler).to receive(:call).and_return(response)
54
+ allow(response_handler).to receive(:call).and_return(tuple)
55
+ end
56
+
57
+ subject! { container.command(:users).create.call(attributes) }
58
+
59
+ it do
60
+ expect(request_handler).to have_received(:call).with(dataset)
61
+ expect(response_handler).to have_received(:call).with(response, dataset)
62
+ is_expected.to eq(tuple)
63
+ end
64
+ end
65
+
66
+ context 'with a collection' do
67
+ let(:response_1) { double }
68
+ let(:response_2) { double }
69
+ let(:tuple_1) { double }
70
+ let(:tuple_2) { double }
71
+ let(:attributes_1) { { first_name: 'John', last_name: 'Jackson' } }
72
+ let(:attributes_2) { { first_name: 'Jill', last_name: 'Smith' } }
73
+ let(:attributes) { [attributes_1, attributes_2] }
74
+ let(:command) do
75
+ Class.new(ROM::HTTP::Commands::Create) do
76
+ register_as :create
77
+ relation :users
78
+ result :many
79
+ end
80
+ end
81
+ let(:dataset_1) do
82
+ ROM::HTTP::Dataset.new(
83
+ {
84
+ uri: uri,
85
+ headers: headers,
86
+ request_handler: request_handler,
87
+ response_handler: response_handler,
88
+ name: :users
89
+ },
90
+ request_method: :post,
91
+ params: attributes_1
92
+ )
93
+ end
94
+ let(:dataset_2) do
95
+ ROM::HTTP::Dataset.new(
96
+ {
97
+ uri: uri,
98
+ headers: headers,
99
+ request_handler: request_handler,
100
+ response_handler: response_handler,
101
+ name: :users
102
+ },
103
+ request_method: :post,
104
+ params: attributes_2
105
+ )
106
+ end
107
+
108
+ before do
109
+ rom.register_relation(relation)
110
+ rom.register_command(command)
111
+
112
+ allow(request_handler).to receive(:call).and_return(response_1, response_2)
113
+ allow(response_handler).to receive(:call).and_return(tuple_1, tuple_2)
114
+ end
115
+
116
+ subject! { container.command(:users).create.call(attributes) }
117
+
118
+ it do
119
+ expect(request_handler).to have_received(:call).with(dataset_1)
120
+ expect(response_handler).to have_received(:call).with(response_1, dataset_1)
121
+ expect(request_handler).to have_received(:call).with(dataset_2)
122
+ expect(response_handler).to have_received(:call).with(response_2, dataset_2)
123
+ is_expected.to eq([tuple_1, tuple_2])
124
+ end
125
+ end
126
+ end
@@ -0,0 +1,61 @@
1
+ RSpec.describe ROM::HTTP::Commands::Delete do
2
+ let(:uri) { 'http://localhost:3000' }
3
+ let(:headers) { { accept: 'application/json' } }
4
+ let(:rom) { ROM::Environment.new }
5
+ let(:container) { rom.finalize.env }
6
+ let(:request_handler) { double(Proc) }
7
+ let(:response_handler) { double(Proc) }
8
+ let(:relation) do
9
+ Class.new(ROM::HTTP::Relation) do
10
+ dataset :users
11
+ end
12
+ end
13
+ let(:response) { double }
14
+ let(:tuple) { double }
15
+ let(:tuples) { double(first: tuple) }
16
+ let(:command) do
17
+ Class.new(ROM::HTTP::Commands::Delete) do
18
+ register_as :delete
19
+ relation :users
20
+ result :one
21
+ end
22
+ end
23
+ let(:dataset) do
24
+ ROM::HTTP::Dataset.new(
25
+ {
26
+ uri: uri,
27
+ headers: headers,
28
+ request_handler: request_handler,
29
+ response_handler: response_handler,
30
+ name: :users
31
+ },
32
+ request_method: :delete
33
+ )
34
+ end
35
+
36
+ before do
37
+ rom.setup(
38
+ :http,
39
+ uri: uri,
40
+ headers: headers,
41
+ request_handler: request_handler,
42
+ response_handler: response_handler
43
+ )
44
+ end
45
+
46
+ before do
47
+ rom.register_relation(relation)
48
+ rom.register_command(command)
49
+
50
+ allow(request_handler).to receive(:call).and_return(response)
51
+ allow(response_handler).to receive(:call).and_return(tuples)
52
+ end
53
+
54
+ subject! { container.command(:users).delete.call }
55
+
56
+ it do
57
+ expect(request_handler).to have_received(:call).with(dataset)
58
+ expect(response_handler).to have_received(:call).with(response, dataset)
59
+ is_expected.to eq(tuple)
60
+ end
61
+ end
@@ -0,0 +1,126 @@
1
+ RSpec.describe ROM::HTTP::Commands::Update do
2
+ let(:uri) { 'http://localhost:3000' }
3
+ let(:headers) { { accept: 'application/json' } }
4
+ let(:rom) { ROM::Environment.new }
5
+ let(:container) { rom.finalize.env }
6
+ let(:request_handler) { double(Proc) }
7
+ let(:response_handler) { double(Proc) }
8
+ let(:relation) do
9
+ Class.new(ROM::HTTP::Relation) do
10
+ dataset :users
11
+ end
12
+ end
13
+
14
+ before do
15
+ rom.setup(
16
+ :http,
17
+ uri: uri,
18
+ headers: headers,
19
+ request_handler: request_handler,
20
+ response_handler: response_handler
21
+ )
22
+ end
23
+
24
+ context 'with single tuple' do
25
+ let(:response) { double }
26
+ let(:tuple) { double }
27
+ let(:attributes) { { first_name: 'John', last_name: 'Jackson' } }
28
+ let(:command) do
29
+ Class.new(ROM::HTTP::Commands::Update) do
30
+ register_as :update
31
+ relation :users
32
+ result :one
33
+ end
34
+ end
35
+ let(:dataset) do
36
+ ROM::HTTP::Dataset.new(
37
+ {
38
+ uri: uri,
39
+ headers: headers,
40
+ request_handler: request_handler,
41
+ response_handler: response_handler,
42
+ name: :users
43
+ },
44
+ request_method: :put,
45
+ params: attributes
46
+ )
47
+ end
48
+
49
+ before do
50
+ rom.register_relation(relation)
51
+ rom.register_command(command)
52
+
53
+ allow(request_handler).to receive(:call).and_return(response)
54
+ allow(response_handler).to receive(:call).and_return(tuple)
55
+ end
56
+
57
+ subject! { container.command(:users).update.call(attributes) }
58
+
59
+ it do
60
+ expect(request_handler).to have_received(:call).with(dataset)
61
+ expect(response_handler).to have_received(:call).with(response, dataset)
62
+ is_expected.to eq(tuple)
63
+ end
64
+ end
65
+
66
+ context 'with a collection' do
67
+ let(:response_1) { double }
68
+ let(:response_2) { double }
69
+ let(:tuple_1) { double }
70
+ let(:tuple_2) { double }
71
+ let(:attributes_1) { { first_name: 'John', last_name: 'Jackson' } }
72
+ let(:attributes_2) { { first_name: 'Jill', last_name: 'Smith' } }
73
+ let(:attributes) { [attributes_1, attributes_2] }
74
+ let(:command) do
75
+ Class.new(ROM::HTTP::Commands::Update) do
76
+ register_as :update
77
+ relation :users
78
+ result :many
79
+ end
80
+ end
81
+ let(:dataset_1) do
82
+ ROM::HTTP::Dataset.new(
83
+ {
84
+ uri: uri,
85
+ headers: headers,
86
+ request_handler: request_handler,
87
+ response_handler: response_handler,
88
+ name: :users
89
+ },
90
+ request_method: :put,
91
+ params: attributes_1
92
+ )
93
+ end
94
+ let(:dataset_2) do
95
+ ROM::HTTP::Dataset.new(
96
+ {
97
+ uri: uri,
98
+ headers: headers,
99
+ request_handler: request_handler,
100
+ response_handler: response_handler,
101
+ name: :users
102
+ },
103
+ request_method: :put,
104
+ params: attributes_2
105
+ )
106
+ end
107
+
108
+ before do
109
+ rom.register_relation(relation)
110
+ rom.register_command(command)
111
+
112
+ allow(request_handler).to receive(:call).and_return(response_1, response_2)
113
+ allow(response_handler).to receive(:call).and_return(tuple_1, tuple_2)
114
+ end
115
+
116
+ subject! { container.command(:users).update.call(attributes) }
117
+
118
+ it do
119
+ expect(request_handler).to have_received(:call).with(dataset_1)
120
+ expect(response_handler).to have_received(:call).with(response_1, dataset_1)
121
+ expect(request_handler).to have_received(:call).with(dataset_2)
122
+ expect(response_handler).to have_received(:call).with(response_2, dataset_2)
123
+ is_expected.to eq([tuple_1, tuple_2])
124
+ end
125
+ end
126
+ end
@@ -0,0 +1,64 @@
1
+ RSpec.describe ROM::HTTP::Relation do
2
+ let(:uri) { 'http://localhost:3000' }
3
+ let(:headers) { { accept: 'application/json' } }
4
+ let(:rom) { ROM::Environment.new }
5
+ let(:container) { rom.finalize.env }
6
+ let(:request_handler) { double(Proc) }
7
+ let(:response_handler) { double(Proc) }
8
+ let(:relation) do
9
+ Class.new(ROM::HTTP::Relation) do
10
+ dataset :users
11
+
12
+ def by_id(id)
13
+ append_path(id.to_s)
14
+ end
15
+
16
+ def filter(params)
17
+ with_params(params)
18
+ end
19
+ end
20
+ end
21
+ let(:response) { double }
22
+ let(:tuples) { [] }
23
+ let(:dataset) do
24
+ ROM::HTTP::Dataset.new(
25
+ {
26
+ uri: uri,
27
+ headers: headers,
28
+ request_handler: request_handler,
29
+ response_handler: response_handler,
30
+ name: :users
31
+ },
32
+ request_method: :get,
33
+ path: "/#{id}",
34
+ params: params
35
+ )
36
+ end
37
+ let(:id) { 1337 }
38
+ let(:params) { { filters: { first_name: 'John' } } }
39
+
40
+ before do
41
+ rom.setup(
42
+ :http,
43
+ uri: uri,
44
+ headers: headers,
45
+ request_handler: request_handler,
46
+ response_handler: response_handler
47
+ )
48
+ end
49
+
50
+ before do
51
+ rom.register_relation(relation)
52
+
53
+ allow(request_handler).to receive(:call).and_return(response)
54
+ allow(response_handler).to receive(:call).and_return(tuples)
55
+ end
56
+
57
+ subject! { container.relation(:users).by_id(id).filter(params).to_a }
58
+
59
+ it do
60
+ expect(request_handler).to have_received(:call).with(dataset).once
61
+ expect(response_handler).to have_received(:call).with(response, dataset).once
62
+ is_expected.to eq(tuples)
63
+ end
64
+ end