restspec 0.0.4 → 0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.yardopts +5 -0
- data/CHANGELOG.md +0 -0
- data/README.md +11 -7
- data/Rakefile +7 -0
- data/bin/restspec +1 -1
- data/examples/store-api-tests/Gemfile.lock +3 -1
- data/examples/store-api-tests/api.md +47 -47
- data/examples/store-api-tests/spec/api/product_spec.rb +0 -2
- data/examples/store-api-tests/spec/api/restspec/endpoints.rb +6 -5
- data/examples/store-api-tests/spec/api/restspec/schemas.rb +2 -1
- data/{docs → guides}/endpoints.md +0 -0
- data/{docs → guides}/helpers.md +0 -0
- data/{docs → guides}/macros.md +0 -0
- data/{docs → guides}/matchers.md +0 -0
- data/{docs → guides}/schemas.md +0 -0
- data/{docs → guides}/tutorial.md +1 -1
- data/{docs → guides}/types.md +0 -0
- data/lib/restspec/configuration.rb +28 -4
- data/lib/restspec/endpoints/dsl.rb +281 -48
- data/lib/restspec/endpoints/endpoint.rb +18 -58
- data/lib/restspec/endpoints/has_schemas.rb +39 -0
- data/lib/restspec/endpoints/namespace.rb +4 -7
- data/lib/restspec/endpoints/network.rb +27 -0
- data/lib/restspec/endpoints/request.rb +3 -0
- data/lib/restspec/endpoints/response.rb +3 -0
- data/lib/restspec/endpoints/url_builder.rb +51 -0
- data/lib/restspec/rspec/api_macros.rb +2 -2
- data/lib/restspec/rspec/matchers/be_like_schema.rb +1 -1
- data/lib/restspec/rspec/matchers/be_like_schema_array.rb +1 -1
- data/lib/restspec/runners/docs/templates/docs.md.erb +2 -2
- data/lib/restspec/schema/attribute.rb +43 -0
- data/lib/restspec/schema/attribute_example.rb +13 -1
- data/lib/restspec/schema/checker.rb +80 -8
- data/lib/restspec/schema/dsl.rb +67 -11
- data/lib/restspec/schema/schema.rb +13 -1
- data/lib/restspec/schema/schema_example.rb +7 -1
- data/lib/restspec/schema/types/array_type.rb +42 -1
- data/lib/restspec/schema/types/basic_type.rb +62 -0
- data/lib/restspec/schema/types/boolean_type.rb +10 -0
- data/lib/restspec/schema/types/date_type.rb +12 -0
- data/lib/restspec/schema/types/datetime_type.rb +16 -0
- data/lib/restspec/schema/types/decimal_string_type.rb +16 -5
- data/lib/restspec/schema/types/decimal_type.rb +17 -1
- data/lib/restspec/schema/types/embedded_schema_type.rb +39 -8
- data/lib/restspec/schema/types/hash_type.rb +51 -12
- data/lib/restspec/schema/types/integer_type.rb +12 -1
- data/lib/restspec/schema/types/null_type.rb +7 -0
- data/lib/restspec/schema/types/one_of_type.rb +18 -0
- data/lib/restspec/schema/types/schema_id_type.rb +14 -17
- data/lib/restspec/schema/types/string_type.rb +9 -0
- data/lib/restspec/schema/types/type_methods.rb +32 -0
- data/lib/restspec/schema/types.rb +1 -18
- data/lib/restspec/shortcuts.rb +10 -0
- data/lib/restspec/stores/endpoint_store.rb +27 -2
- data/lib/restspec/stores/namespace_store.rb +23 -4
- data/lib/restspec/stores/schema_store.rb +15 -0
- data/lib/restspec/values/status_code.rb +16 -1
- data/lib/restspec/version.rb +1 -1
- data/lib/restspec.rb +2 -0
- data/restspec.gemspec +2 -0
- data/spec/restspec/endpoints/dsl_spec.rb +32 -19
- data/spec/restspec/endpoints/endpoint_spec.rb +20 -43
- data/spec/restspec/endpoints/namespace_spec.rb +0 -7
- data/spec/restspec/endpoints/request_spec.rb +33 -0
- data/spec/restspec/schema/attribute_spec.rb +44 -0
- data/spec/restspec/schema/checker_spec.rb +57 -0
- data/spec/restspec/schema/dsl_spec.rb +1 -1
- data/spec/restspec/schema/schema_spec.rb +15 -0
- data/spec/restspec/schema/types/basic_type_spec.rb +2 -2
- data/spec/restspec/schema/types/decimal_string_type_spec.rb +56 -0
- data/spec/restspec/schema/types/decimal_type_spec.rb +25 -0
- data/spec/restspec/schema/types/embedded_schema_type_spec.rb +32 -0
- data/spec/restspec/schema/types/hash_type_spec.rb +39 -0
- data/spec/restspec/schema/types/integer_type_spec.rb +28 -0
- data/spec/restspec/schema/types/one_of_type_spec.rb +21 -0
- data/spec/restspec/stores/endpoint_store_spec.rb +62 -0
- metadata +63 -10
- data/ROADMAP.md +0 -13
@@ -17,12 +17,12 @@ describe Restspec::Endpoints::DSL do
|
|
17
17
|
|
18
18
|
it 'creates a namespace with the given name as a string' do
|
19
19
|
dsl.namespace(:monkey) { }
|
20
|
-
expect(Restspec::NamespaceStore.
|
20
|
+
expect(Restspec::NamespaceStore.get(:monkey).name).to eq('monkey')
|
21
21
|
end
|
22
22
|
|
23
23
|
it 'creates a namespace with the given base_path' do
|
24
24
|
dsl.namespace(:monkey, base_path: '/monkey') { }
|
25
|
-
expect(Restspec::NamespaceStore.
|
25
|
+
expect(Restspec::NamespaceStore.get(:monkey).full_base_path).to eq('/monkey')
|
26
26
|
end
|
27
27
|
|
28
28
|
it 'yields a Restspec::Endpoints::NamespaceDSL attached to the namespace to the block' do
|
@@ -39,19 +39,24 @@ describe Restspec::Endpoints::DSL do
|
|
39
39
|
end
|
40
40
|
|
41
41
|
expect(namespace_dsl).to have_received(:call)
|
42
|
-
expect(namespace_dsl.namespace).to eq(Restspec::NamespaceStore.
|
42
|
+
expect(namespace_dsl.namespace).to eq(Restspec::NamespaceStore.get(:monkey))
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
46
46
|
describe '#resource' do
|
47
|
+
before do
|
48
|
+
schema = Restspec::Schema::Schema.new(:monkey)
|
49
|
+
Restspec::SchemaStore.store(schema)
|
50
|
+
end
|
51
|
+
|
47
52
|
it 'creates a namespace with the base_path equals to /:name' do
|
48
53
|
dsl.resource(:monkeys) { }
|
49
|
-
expect(Restspec::NamespaceStore.
|
54
|
+
expect(Restspec::NamespaceStore.get(:monkeys).full_base_path).to eq('/monkeys')
|
50
55
|
end
|
51
56
|
|
52
57
|
it 'creates a namespace with the schema attached to some schema with the same name' do
|
53
58
|
dsl.resource(:monkeys) { }
|
54
|
-
expect(Restspec::NamespaceStore.
|
59
|
+
expect(Restspec::NamespaceStore.get(:monkeys).schema_for(:response).name).to eq(:monkey)
|
55
60
|
end
|
56
61
|
end
|
57
62
|
|
@@ -86,14 +91,22 @@ describe Restspec::Endpoints::DSL do
|
|
86
91
|
end
|
87
92
|
|
88
93
|
describe '#schema' do
|
94
|
+
before do
|
95
|
+
Restspec::SchemaStore.store(Restspec::Schema::Schema.new(:schema_name))
|
96
|
+
end
|
97
|
+
|
89
98
|
it 'sets the schema_name of the namespace' do
|
90
99
|
expect do
|
91
100
|
ns_dsl.schema :schema_name
|
92
|
-
end.to change { namespace.
|
101
|
+
end.to change { namespace.schema_for(:response).try(:name) }.to(:schema_name)
|
93
102
|
end
|
94
103
|
end
|
95
104
|
|
96
105
|
describe '#all' do
|
106
|
+
before do
|
107
|
+
Restspec::SchemaStore.store(Restspec::Schema::Schema.new(:a_schema_name))
|
108
|
+
end
|
109
|
+
|
97
110
|
it 'calls the same block in all the endpoints inside' do
|
98
111
|
ns_dsl.all do
|
99
112
|
schema :a_schema_name
|
@@ -105,8 +118,8 @@ describe Restspec::Endpoints::DSL do
|
|
105
118
|
endpoint_a = Restspec::EndpointStore.get('monkeys/a')
|
106
119
|
endpoint_b = Restspec::EndpointStore.get('monkeys/b')
|
107
120
|
|
108
|
-
expect(endpoint_a.
|
109
|
-
expect(
|
121
|
+
expect(endpoint_a.schema_for(:response).name).to eq(:a_schema_name)
|
122
|
+
expect(endpoint_a.schema_for(:response).name).to eq(:a_schema_name)
|
110
123
|
end
|
111
124
|
end
|
112
125
|
|
@@ -196,19 +209,19 @@ describe Restspec::Endpoints::DSL do
|
|
196
209
|
end
|
197
210
|
end
|
198
211
|
|
199
|
-
describe '#
|
200
|
-
it '
|
201
|
-
|
202
|
-
|
203
|
-
|
212
|
+
describe '#no_schema' do
|
213
|
+
it 'removes the schema' do
|
214
|
+
endpoint_dsl.schema :monkey
|
215
|
+
endpoint_dsl.no_schema
|
216
|
+
expect(endpoint.all_schemas).to eq([])
|
204
217
|
end
|
218
|
+
end
|
205
219
|
|
206
|
-
|
207
|
-
|
208
|
-
|
220
|
+
describe '#schema' do
|
221
|
+
it 'sets the schema for response' do
|
209
222
|
expect {
|
210
|
-
endpoint_dsl.schema :monkey
|
211
|
-
}.to change { endpoint.
|
223
|
+
endpoint_dsl.schema :monkey
|
224
|
+
}.to change { endpoint.schema_for(:response).try(:name) }.from(nil).to(:monkey)
|
212
225
|
end
|
213
226
|
end
|
214
227
|
|
@@ -250,7 +263,7 @@ describe Restspec::Endpoints::DSL do
|
|
250
263
|
let(:schema) { double(attributes: { param: 1 }) }
|
251
264
|
|
252
265
|
before do
|
253
|
-
allow(endpoint).to receive(:
|
266
|
+
allow(endpoint).to receive(:schema_for).and_return(schema)
|
254
267
|
end
|
255
268
|
|
256
269
|
it 'calls the example_for with the attribute from the schema' do
|
@@ -6,6 +6,25 @@ describe Endpoint do
|
|
6
6
|
let(:endpoint) { Endpoint.new(:endpoint) }
|
7
7
|
subject { endpoint }
|
8
8
|
|
9
|
+
describe '#payload' do
|
10
|
+
let(:schema) do
|
11
|
+
dsl = Restspec::Schema::SingleSchemaDSL.new(:product, {})
|
12
|
+
dsl.instance_eval do
|
13
|
+
attribute :title, string, example: 'monkey'
|
14
|
+
end
|
15
|
+
dsl.schema
|
16
|
+
end
|
17
|
+
|
18
|
+
before do
|
19
|
+
Restspec::SchemaStore.store(schema)
|
20
|
+
endpoint.add_schema(schema.name, :for => [:payload])
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'is an example for the schema' do
|
24
|
+
expect(endpoint.payload).to eq(title: 'monkey')
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
9
28
|
describe '#full_name' do
|
10
29
|
context 'standalone' do
|
11
30
|
its(:full_name) { should eq('endpoint') }
|
@@ -66,48 +85,6 @@ describe Endpoint do
|
|
66
85
|
end
|
67
86
|
end
|
68
87
|
|
69
|
-
describe '#schema_name' do
|
70
|
-
context 'stadalone' do
|
71
|
-
before { endpoint.schema_name = :schema_name }
|
72
|
-
its(:schema_name) { should eq(:schema_name) }
|
73
|
-
end
|
74
|
-
|
75
|
-
context 'inside a namespace' do
|
76
|
-
let(:namespace) do
|
77
|
-
Namespace.new(:namespace).tap do |ns|
|
78
|
-
ns.schema_name = :ns_schema_name
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
before { endpoint.namespace = namespace }
|
83
|
-
|
84
|
-
context 'without a single schema name' do
|
85
|
-
its(:schema_name) { should eq(:ns_schema_name) }
|
86
|
-
end
|
87
|
-
|
88
|
-
context 'with a single schema name' do
|
89
|
-
before { endpoint.schema_name = :single_schema_name }
|
90
|
-
its(:schema_name) { should eq(:single_schema_name) }
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
describe '#schema' do
|
96
|
-
let(:schema) { double }
|
97
|
-
|
98
|
-
before do
|
99
|
-
endpoint.schema_name = :single_schema_name
|
100
|
-
allow(Restspec::SchemaStore).to receive(:get).and_return(schema)
|
101
|
-
allow(schema).to receive(:extend_with) { schema }
|
102
|
-
end
|
103
|
-
|
104
|
-
it 'tells the Restspec::Schema::Finder to find a schema' do
|
105
|
-
found_schema = endpoint.schema
|
106
|
-
expect(Restspec::SchemaStore).to have_received(:get).with(:single_schema_name)
|
107
|
-
expect(found_schema).to eq(schema)
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
88
|
describe '#url_params' do
|
112
89
|
before do
|
113
90
|
endpoint.add_url_param_block(:mono) { 'mono' }
|
@@ -130,8 +107,8 @@ describe Endpoint do
|
|
130
107
|
end
|
131
108
|
|
132
109
|
context 'inside an anonymous namespace (a member or collection block)' do
|
133
|
-
let(:member_namespace) { Namespace.create }
|
134
110
|
let(:top_level_namespace) { Namespace.create('top_level') }
|
111
|
+
let(:member_namespace) { top_level_namespace.add_anonymous_children_namespace }
|
135
112
|
|
136
113
|
before do
|
137
114
|
top_level_namespace.base_path = '/monkeys'
|
@@ -10,13 +10,6 @@ describe Namespace do
|
|
10
10
|
namespace = Namespace.create(:name)
|
11
11
|
expect(Restspec::NamespaceStore.get(:name)).to eq(namespace)
|
12
12
|
end
|
13
|
-
|
14
|
-
context 'without arguments' do
|
15
|
-
it 'creates an anonymous namespace' do
|
16
|
-
namespace = Namespace.create
|
17
|
-
expect(namespace).to be_anonymous
|
18
|
-
end
|
19
|
-
end
|
20
13
|
end
|
21
14
|
|
22
15
|
describe '#add_anonymous_children_namespace' do
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
include Restspec::Endpoints
|
4
|
+
|
5
|
+
describe Request do
|
6
|
+
let(:request) do
|
7
|
+
Request.new(:get, '/url', {'header' => 'header'}, {'payload' => 'payload'})
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'is a bag for request data' do
|
11
|
+
expect(request.method).to eq(:get)
|
12
|
+
expect(request.url).to eq('/url')
|
13
|
+
expect(request.headers).to eq({'header' => 'header'})
|
14
|
+
expect(request.payload).to eq({'payload' => 'payload'})
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '#endpoint=' do
|
18
|
+
let(:endpoint) { double }
|
19
|
+
|
20
|
+
it 'injects an endpoint' do
|
21
|
+
request.endpoint = endpoint
|
22
|
+
expect(request.endpoint).to eq(endpoint)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe '#raw_payload' do
|
27
|
+
it 'is the raw payload to send through the wire json encoded' do
|
28
|
+
request.payload = { 'hola' => 'mundo' }
|
29
|
+
expect(JSON.parse(request.raw_payload)).to eq(request.payload)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
include Restspec::Schema
|
4
|
+
|
5
|
+
describe Attribute do
|
6
|
+
let(:type) { double }
|
7
|
+
|
8
|
+
describe '#example' do
|
9
|
+
let(:example) { 'example' }
|
10
|
+
let(:attribute) { Attribute.new(:name, type, example: example) }
|
11
|
+
|
12
|
+
it 'returns the example option' do
|
13
|
+
expect(attribute.example).to eq(example)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '#can_generate_examples?' do
|
18
|
+
subject { attribute.can_generate_examples? }
|
19
|
+
|
20
|
+
context 'without the option' do
|
21
|
+
let(:attribute) { Attribute.new(:name, type, example: 'example', :for => []) }
|
22
|
+
it { should eq(false) }
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'with the option' do
|
26
|
+
let(:attribute) { Attribute.new(:name, type, example: 'example', :for => [:examples]) }
|
27
|
+
it { should eq(true) }
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe '#can_be_checked?' do
|
32
|
+
subject { attribute.can_be_checked? }
|
33
|
+
|
34
|
+
context 'without the option' do
|
35
|
+
let(:attribute) { Attribute.new(:name, type, :for => []) }
|
36
|
+
it { should eq(false) }
|
37
|
+
end
|
38
|
+
|
39
|
+
context 'with the option' do
|
40
|
+
let(:attribute) { Attribute.new(:name, type, :for => [:checks]) }
|
41
|
+
it { should eq(true) }
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
include Restspec::Schema
|
4
|
+
|
5
|
+
describe Checker do
|
6
|
+
let(:schema) do
|
7
|
+
Schema.new(:product).tap do |schema|
|
8
|
+
schema.attributes[:name] = Attribute.new(:name, Types::StringType.new)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
let(:checker) { Checker.new(schema) }
|
13
|
+
|
14
|
+
describe '#check!' do
|
15
|
+
context 'when no object is sent' do
|
16
|
+
it 'raises a Checker::NoObjectError' do
|
17
|
+
expect do
|
18
|
+
checker.check!(nil)
|
19
|
+
end.to raise_error(Checker::NoObjectError, /Nil/)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'when no attribute is present' do
|
24
|
+
it 'raises a Checker::NoAttributeError' do
|
25
|
+
expect do
|
26
|
+
checker.check!(age: 10)
|
27
|
+
end.to raise_error(Checker::NoAttributeError, /name/)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
context 'when the attribute is not valid' do
|
32
|
+
it 'raises a Checker::InvalidationError' do
|
33
|
+
expect do
|
34
|
+
checker.check!(name: 10)
|
35
|
+
end.to raise_error(Checker::InvalidationError, /string/)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
context 'when the attribute is present and valid' do
|
40
|
+
it 'does not raises any error' do
|
41
|
+
expect do
|
42
|
+
checker.check!(name: 'John')
|
43
|
+
end.to_not raise_error
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe '#check_array!' do
|
49
|
+
let(:array) { [1, 2, 3] }
|
50
|
+
|
51
|
+
it 'calls #check! with every item of the array' do
|
52
|
+
allow(checker).to receive(:check!).and_return(true)
|
53
|
+
checker.check_array!(array)
|
54
|
+
expect(checker).to have_received(:check!).exactly(3).times
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -78,7 +78,7 @@ describe SingleSchemaDSL do
|
|
78
78
|
|
79
79
|
describe '#include_attributes' do
|
80
80
|
let(:main_dsl) { DSL.new }
|
81
|
-
let(:schema_dsl) { SingleSchemaDSL.new(:name, main_dsl.mixins) }
|
81
|
+
let(:schema_dsl) { SingleSchemaDSL.new(:name, main_dsl.send(:mixins)) }
|
82
82
|
|
83
83
|
before do
|
84
84
|
main_dsl.mixin :test_mixin do
|
@@ -8,4 +8,19 @@ describe Restspec::Schema::Schema do
|
|
8
8
|
expect(person_schema.attributes).to eq({})
|
9
9
|
expect(person_schema.name).to eq(:person)
|
10
10
|
end
|
11
|
+
|
12
|
+
describe '#extend_with' do
|
13
|
+
let(:schema) { Schema.new(:person) }
|
14
|
+
|
15
|
+
before do
|
16
|
+
schema.attributes['attribute'] = 'Attribute'
|
17
|
+
end
|
18
|
+
|
19
|
+
context 'using :without' do
|
20
|
+
it 'removes an attribute' do
|
21
|
+
schema.extend_with(without: ['attribute'])
|
22
|
+
expect(schema.attributes).to_not have_key('attribute')
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
11
26
|
end
|
@@ -13,7 +13,7 @@ describe BasicType do
|
|
13
13
|
let(:attribute) { double }
|
14
14
|
let(:value) { double }
|
15
15
|
|
16
|
-
describe '
|
16
|
+
describe '#|' do
|
17
17
|
let(:other_type) { subclass.new }
|
18
18
|
|
19
19
|
before do
|
@@ -38,7 +38,7 @@ describe BasicType do
|
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
|
-
describe 'of' do
|
41
|
+
describe '#of' do
|
42
42
|
let(:other_type) { subclass.new }
|
43
43
|
|
44
44
|
let(:subclass) do
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
include Restspec::Schema::Types
|
4
|
+
|
5
|
+
describe DecimalStringType do
|
6
|
+
let(:options) { {} }
|
7
|
+
let(:type) { DecimalStringType.new options }
|
8
|
+
|
9
|
+
describe '#example_for' do
|
10
|
+
it 'generates a random number wrapped in a string' do
|
11
|
+
10.times do
|
12
|
+
sample = type.example_for(double)
|
13
|
+
expect(sample).to respond_to(:to_f)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe '#valid?' do
|
19
|
+
context 'without integer_part or decimal_part options' do
|
20
|
+
it 'will validate against any decimal string' do
|
21
|
+
expect(type.totally_valid?(double, '0.1001019')).to eq(true)
|
22
|
+
expect(type.totally_valid?(double, '9992329323.9')).to eq(true)
|
23
|
+
expect(type.totally_valid?(double, '9992329323.0')).to eq(true)
|
24
|
+
expect(type.totally_valid?(double, '9992329323')).to eq(true)
|
25
|
+
expect(type.totally_valid?(double, 'mono')).to eq(false)
|
26
|
+
expect(type.totally_valid?(double, '')).to eq(false)
|
27
|
+
expect(type.totally_valid?(double, 199.99)).to eq(false)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
context 'with integer part and decimal part options' do
|
32
|
+
context 'with 2,2' do
|
33
|
+
let(:options) { { schema_options: { integer_part: 2, decimal_part: 2 } } }
|
34
|
+
|
35
|
+
it 'will validate only against strings with two integer parts and two decimal parts' do
|
36
|
+
expect(type.totally_valid?(double, '2.22')).to eq(true)
|
37
|
+
expect(type.totally_valid?(double, '22.22')).to eq(true)
|
38
|
+
expect(type.totally_valid?(double, '222.22')).to eq(false)
|
39
|
+
expect(type.totally_valid?(double, '22.221')).to eq(false)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context 'with 2,0' do
|
44
|
+
let(:options) { { schema_options: { integer_part: 2, decimal_part: 0 } } }
|
45
|
+
|
46
|
+
it 'will validate only against strings with two integer parts and 0 decimal parts' do
|
47
|
+
expect(type.totally_valid?(double, '2')).to eq(true)
|
48
|
+
expect(type.totally_valid?(double, '22')).to eq(true)
|
49
|
+
expect(type.totally_valid?(double, '222.22')).to eq(false)
|
50
|
+
expect(type.totally_valid?(double, '22.2')).to eq(false)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
include Restspec::Schema::Types
|
4
|
+
|
5
|
+
describe DecimalType do
|
6
|
+
let(:options) { {} }
|
7
|
+
let(:type) { DecimalType.new(options) }
|
8
|
+
|
9
|
+
describe '#example_for' do
|
10
|
+
it 'generates numbers' do
|
11
|
+
10.times do
|
12
|
+
expect(type.example_for(double)).to be_kind_of(Numeric)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '#valid?' do
|
18
|
+
it 'only validates numbers' do
|
19
|
+
expect(type.totally_valid?(double, 100)).to eq(true)
|
20
|
+
expect(type.totally_valid?(double, '100')).to eq(false)
|
21
|
+
expect(type.totally_valid?(double, 'mono')).to eq(false)
|
22
|
+
expect(type.totally_valid?(double, nil)).to eq(false)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
include Restspec::Schema::Types
|
4
|
+
|
5
|
+
describe EmbeddedSchemaType do
|
6
|
+
let(:type) { EmbeddedSchemaType.new(:category) }
|
7
|
+
|
8
|
+
before do
|
9
|
+
Restspec::Schema::DSL.new.instance_eval do
|
10
|
+
schema :category do
|
11
|
+
attribute :name, string
|
12
|
+
attribute :description, string
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '#example_for' do
|
18
|
+
it 'is a example of the embedded schema' do
|
19
|
+
sample = type.example_for(double)
|
20
|
+
expect(sample[:name]).to be_a_kind_of(String)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe '#valid?' do
|
25
|
+
it 'is valid if this works with the embedded schema' do
|
26
|
+
expect(type.totally_valid?(double, name: 'Name', description: 'Desc')).to eq(true)
|
27
|
+
expect(type.totally_valid?(double, name: 'Name')).to eq(false)
|
28
|
+
expect(type.totally_valid?(double, age: 10)).to eq(false)
|
29
|
+
expect(type.totally_valid?(double, name: 'Name', description: nil)).to eq(false)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
include Restspec::Schema::Types
|
4
|
+
|
5
|
+
describe HashType do
|
6
|
+
let(:options) { {} }
|
7
|
+
let(:type) { HashType.new(options) }
|
8
|
+
|
9
|
+
describe '#example_for' do
|
10
|
+
it 'returns an empty hash' do
|
11
|
+
expect(type.example_for(double)).to eq({})
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe '#valid?' do
|
16
|
+
it 'validates if it is a hash' do
|
17
|
+
expect(type.totally_valid?(double, {a: 1})).to eq(true)
|
18
|
+
expect(type.totally_valid?(double, '{a: 1}')).to eq(false)
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'with some specified keys' do
|
22
|
+
let(:options) { { schema_options: { keys: ['name', 'age'] } } }
|
23
|
+
|
24
|
+
it 'validates if the keys are present' do
|
25
|
+
expect(type.totally_valid?(double, { 'name' => 'name', 'age' => 19 })).to eq(true)
|
26
|
+
expect(type.totally_valid?(double, { 'name' => 'name', 'number' => 19 })).to eq(false)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
context 'with a specified value_type' do
|
31
|
+
let(:options) { { schema_options: { value_type: StringType.new } } }
|
32
|
+
|
33
|
+
it 'validates that the values are of that type' do
|
34
|
+
expect(type.totally_valid?(double, { 'a' => '1', 'b' => '2' })).to eq(true)
|
35
|
+
expect(type.totally_valid?(double, { 'a' => '1', 'b' => 2 })).to eq(false)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
include Restspec::Schema::Types
|
4
|
+
|
5
|
+
describe IntegerType do
|
6
|
+
let(:type) { IntegerType.new }
|
7
|
+
let(:attribute) { double }
|
8
|
+
|
9
|
+
describe '#example_for' do
|
10
|
+
it 'returns a number' do
|
11
|
+
10.times do
|
12
|
+
expect(type.example_for(attribute)).to be_a_kind_of(Fixnum)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '#valid?' do
|
18
|
+
it 'only validates integer values' do
|
19
|
+
expect(type.valid?(attribute, 1)).to eq(true)
|
20
|
+
expect(type.valid?(attribute, -10)).to eq(true)
|
21
|
+
expect(type.valid?(attribute, -10.5)).to eq(false)
|
22
|
+
expect(type.valid?(attribute, '10.5')).to eq(false)
|
23
|
+
expect(type.valid?(attribute, '10')).to eq(false)
|
24
|
+
expect(type.valid?(attribute, 'no')).to eq(false)
|
25
|
+
expect(type.valid?(attribute, nil)).to eq(false)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
include Restspec::Schema::Types
|
4
|
+
|
5
|
+
describe OneOfType do
|
6
|
+
let(:type) { OneOfType.new(elements: [1, 2, 3]) }
|
7
|
+
|
8
|
+
describe '#example_for' do
|
9
|
+
it 'returns one example of the elements array' do
|
10
|
+
expect([1, 2, 3]).to include(type.example_for(double))
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe '#valid' do
|
15
|
+
it 'checks if the value is one of the elements array' do
|
16
|
+
expect(type.totally_valid?(double, 1)).to eq(true)
|
17
|
+
expect(type.totally_valid?(double, nil)).to eq(false)
|
18
|
+
expect(type.totally_valid?(double, '1')).to eq(false)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
include Restspec::Stores
|
4
|
+
|
5
|
+
describe "EndpointStore" do
|
6
|
+
let(:endpoint) { OpenStruct.new(:full_name => :name) }
|
7
|
+
|
8
|
+
before do
|
9
|
+
EndpointStore.clear
|
10
|
+
end
|
11
|
+
|
12
|
+
describe '#store' do
|
13
|
+
it 'stores the endpoint in a key hash called name' do
|
14
|
+
EndpointStore.store(endpoint)
|
15
|
+
expect(EndpointStore.get(:name)).to eq(endpoint)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe '#get_by_schema_name_and_role' do
|
20
|
+
before do
|
21
|
+
Restspec::SchemaStore.store(Restspec::Schema::Schema.new(:schema_name_1))
|
22
|
+
Restspec::SchemaStore.store(Restspec::Schema::Schema.new(:schema_name_2))
|
23
|
+
end
|
24
|
+
|
25
|
+
let(:endpoint_1) do
|
26
|
+
Restspec::Endpoints::Endpoint.new(:name_1).tap do |endpoint|
|
27
|
+
endpoint.add_schema :schema_name_1, :for => [:response]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
let(:endpoint_2) do
|
32
|
+
Restspec::Endpoints::Endpoint.new(:name_2).tap do |endpoint|
|
33
|
+
endpoint.add_schema :schema_name_2, :for => [:response]
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
before do
|
38
|
+
EndpointStore.store(endpoint_1)
|
39
|
+
EndpointStore.store(endpoint_2)
|
40
|
+
end
|
41
|
+
|
42
|
+
context 'without something with the same schema' do
|
43
|
+
let(:found_endpoint) do
|
44
|
+
EndpointStore.get_by_schema_name_and_role(:schema_name_1, :name_2, :response)
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'is nil' do
|
48
|
+
expect(found_endpoint).to be_nil
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
context 'with something with the same schema and name' do
|
53
|
+
let(:found_endpoint) do
|
54
|
+
EndpointStore.get_by_schema_name_and_role(:schema_name_1, :name_1, :response)
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'is the correct endpoint' do
|
58
|
+
expect(found_endpoint).to eq(endpoint_1)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|