restspec 0.0.4 → 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.
- 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
|