rom-http 0.0.1

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