fitting 2.17.0 → 2.18.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +31 -3
- data/CHANGELOG.md +5 -0
- data/fitting.gemspec +7 -7
- data/lib/fitting/configuration/legacy.rb +6 -5
- data/lib/fitting/configuration/yaml.rb +2 -2
- data/lib/fitting/cover/json_schema.rb +3 -2
- data/lib/fitting/cover/json_schema_enum.rb +1 -1
- data/lib/fitting/cover/json_schema_one_of.rb +1 -1
- data/lib/fitting/cover/response.rb +1 -5
- data/lib/fitting/documentation.rb +0 -2
- data/lib/fitting/matchers/response_matcher.rb +2 -1
- data/lib/fitting/records/documented/request.rb +1 -0
- data/lib/fitting/records/realized_unit.rb +13 -15
- data/lib/fitting/records/spherical/request.rb +1 -1
- data/lib/fitting/records/spherical/requests.rb +2 -1
- data/lib/fitting/records/spherical/response.rb +2 -2
- data/lib/fitting/records/test_unit/request.rb +4 -0
- data/lib/fitting/records/tested/request.rb +1 -1
- data/lib/fitting/records/unit/combination.rb +5 -6
- data/lib/fitting/records/unit/json_schema.rb +38 -33
- data/lib/fitting/records/unit/request.rb +1 -0
- data/lib/fitting/records/unit/response.rb +1 -0
- data/lib/fitting/report/action.rb +6 -9
- data/lib/fitting/report/actions.rb +7 -5
- data/lib/fitting/report/combination.rb +1 -15
- data/lib/fitting/report/combinations.rb +5 -6
- data/lib/fitting/report/console.rb +4 -3
- data/lib/fitting/report/prefix.rb +42 -51
- data/lib/fitting/report/prefixes.rb +3 -3
- data/lib/fitting/report/response.rb +17 -18
- data/lib/fitting/report/responses.rb +9 -8
- data/lib/fitting/report/test.rb +9 -11
- data/lib/fitting/report/tests.rb +10 -13
- data/lib/fitting/request.rb +0 -1
- data/lib/fitting/response.rb +4 -3
- data/lib/fitting/statistics/cover_error.rb +2 -0
- data/lib/fitting/statistics/cover_error_enum.rb +2 -0
- data/lib/fitting/statistics/cover_error_one_of.rb +2 -0
- data/lib/fitting/statistics/list.rb +5 -4
- data/lib/fitting/statistics/not_covered_responses.rb +1 -1
- data/lib/fitting/statistics/percent.rb +2 -1
- data/lib/fitting/statistics/template.rb +10 -8
- data/lib/fitting/storage/white_list.rb +7 -0
- data/lib/fitting/templates/realized_template.rb +2 -0
- data/lib/fitting/tests.rb +1 -1
- data/lib/fitting/version.rb +1 -1
- data/lib/fitting.rb +5 -2
- data/lib/tasks/fitting.rake +62 -54
- metadata +17 -49
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 86988a5ed3f114df581b0d6c6550867e2f9864f05808b6ec66a063f2ad573c93
|
4
|
+
data.tar.gz: 0b1c58784f5838caea3942d022f9dfaa4196912a7f30119e0b3e1b71080f9e43
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d8f5d03f52a1332fc7483f17c8bbfde3c3a751a1c8f539f65637137e8b6ef95d251574105b5cecd9f4292f47f3a951ad45d9a9c914cfbee450b2d1eee8f1e25e
|
7
|
+
data.tar.gz: d40fe0ae76fa5a381e19c1444d84ae90262571cbf2ab9d3198d299b71333f042ccd1a637f150c28403b2a4ccb96b7abf230d9638ffb4ef645700244c4d8194db
|
data/.rubocop.yml
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
AllCops:
|
2
|
-
TargetRubyVersion: 2.
|
2
|
+
TargetRubyVersion: 2.6
|
3
3
|
|
4
|
-
|
5
|
-
Max:
|
4
|
+
Layout/LineLength:
|
5
|
+
Max: 130
|
6
6
|
|
7
7
|
Style/Documentation:
|
8
8
|
Enabled: false
|
@@ -18,3 +18,31 @@ Style/CaseEquality:
|
|
18
18
|
|
19
19
|
Style/NilComparison:
|
20
20
|
Enabled: false
|
21
|
+
|
22
|
+
Naming/MemoizedInstanceVariableName:
|
23
|
+
Enabled: false
|
24
|
+
|
25
|
+
Lint/UnreachableCode:
|
26
|
+
Enabled: false
|
27
|
+
|
28
|
+
Metrics/MethodLength:
|
29
|
+
Max: 50
|
30
|
+
|
31
|
+
# FIXME
|
32
|
+
Metrics/AbcSize:
|
33
|
+
Max: 50
|
34
|
+
|
35
|
+
Metrics/PerceivedComplexity:
|
36
|
+
Max: 20
|
37
|
+
|
38
|
+
Metrics/CyclomaticComplexity:
|
39
|
+
Max: 20
|
40
|
+
|
41
|
+
Metrics/ParameterLists:
|
42
|
+
Max: 7
|
43
|
+
|
44
|
+
Metrics/ClassLength:
|
45
|
+
Max: 150
|
46
|
+
|
47
|
+
Lint/UselessAssignment:
|
48
|
+
Enabled: false
|
data/CHANGELOG.md
CHANGED
data/fitting.gemspec
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
lib = File.expand_path('
|
1
|
+
lib = File.expand_path('lib', __dir__)
|
2
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
3
|
require 'fitting/version'
|
4
4
|
|
@@ -18,13 +18,13 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
19
19
|
spec.require_paths = ['lib']
|
20
20
|
|
21
|
+
spec.required_ruby_version = '>= 2.6.0'
|
21
22
|
spec.add_runtime_dependency 'json-schema', '~> 2.6', '>= 2.6.2'
|
22
|
-
spec.add_runtime_dependency 'multi_json', '~> 1.11'
|
23
23
|
spec.add_runtime_dependency 'tomograph', '~> 3.1', '>= 3.1.0'
|
24
24
|
spec.add_development_dependency 'bundler', '~> 2.0'
|
25
|
-
spec.add_development_dependency 'byebug', '~>
|
26
|
-
spec.add_development_dependency 'rake', '~>
|
27
|
-
spec.add_development_dependency 'rspec', '~> 3.
|
28
|
-
spec.add_development_dependency 'rubocop', '~>
|
29
|
-
spec.add_development_dependency 'simplecov', '~> 0.
|
25
|
+
spec.add_development_dependency 'byebug', '~> 11.1', '>= 11.1.3'
|
26
|
+
spec.add_development_dependency 'rake', '~> 13.0', '>= 13.0.6'
|
27
|
+
spec.add_development_dependency 'rspec', '~> 3.10'
|
28
|
+
spec.add_development_dependency 'rubocop', '~> 1.22.0'
|
29
|
+
spec.add_development_dependency 'simplecov', '~> 0.21'
|
30
30
|
end
|
@@ -36,11 +36,12 @@ module Fitting
|
|
36
36
|
drafter_4_apib_path: @drafter_4_apib_path,
|
37
37
|
drafter_4_yaml_path: @drafter_4_yaml_path
|
38
38
|
)
|
39
|
-
else
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
39
|
+
else
|
40
|
+
Tomograph::Tomogram.new(
|
41
|
+
prefix: @prefix,
|
42
|
+
apib_path: @apib_path,
|
43
|
+
drafter_yaml_path: @drafter_yaml_path
|
44
|
+
)
|
44
45
|
end
|
45
46
|
end
|
46
47
|
|
@@ -43,13 +43,13 @@ module Fitting
|
|
43
43
|
Tomograph::Tomogram.new(
|
44
44
|
prefix: @prefix,
|
45
45
|
crafter_apib_path: @crafter_apib_path,
|
46
|
-
crafter_yaml_path: @crafter_yaml_path
|
46
|
+
crafter_yaml_path: @crafter_yaml_path
|
47
47
|
)
|
48
48
|
elsif @drafter_4_apib_path || @drafter_4_yaml_path
|
49
49
|
Tomograph::Tomogram.new(
|
50
50
|
prefix: @prefix,
|
51
51
|
drafter_4_apib_path: @drafter_4_apib_path,
|
52
|
-
drafter_4_yaml_path: @drafter_4_yaml_path
|
52
|
+
drafter_4_yaml_path: @drafter_4_yaml_path
|
53
53
|
)
|
54
54
|
else
|
55
55
|
Tomograph::Tomogram.new(
|
@@ -15,17 +15,18 @@ module Fitting
|
|
15
15
|
|
16
16
|
def inception(json_schema, combinations)
|
17
17
|
json_schema.each do |key, value|
|
18
|
-
if key == 'properties'
|
18
|
+
if (key == 'properties') && (json_schema['required'] != value.keys)
|
19
19
|
schema = json_schema.dup
|
20
20
|
one_of = schema.delete('required') || []
|
21
21
|
schema['properties'].each_key do |property|
|
22
22
|
next if one_of.include?(property)
|
23
|
+
|
23
24
|
combinations.push([schema.merge('required' => one_of + [property]), "required.#{property}"])
|
24
25
|
end
|
25
26
|
elsif value.is_a?(Hash)
|
26
27
|
com = inception(value, [])
|
27
28
|
com.each do |combination|
|
28
|
-
combination[0] = { key => value.merge(combination[0])}
|
29
|
+
combination[0] = { key => value.merge(combination[0]) }
|
29
30
|
combination[1] = "#{key}.#{combination[1]}"
|
30
31
|
end
|
31
32
|
combinations += com
|
@@ -24,7 +24,7 @@ module Fitting
|
|
24
24
|
elsif value.is_a?(Hash)
|
25
25
|
com = inception(value, [])
|
26
26
|
com.each do |combination|
|
27
|
-
combination[0] = { key => value.merge(combination[0])}
|
27
|
+
combination[0] = { key => value.merge(combination[0]) }
|
28
28
|
combination[1] = "#{key}.#{combination[1]}"
|
29
29
|
end
|
30
30
|
combinations += com
|
@@ -24,7 +24,7 @@ module Fitting
|
|
24
24
|
elsif value.is_a?(Hash)
|
25
25
|
com = inception(value, [])
|
26
26
|
com.each do |combination|
|
27
|
-
combination[0] = { key => value.merge(combination[0])}
|
27
|
+
combination[0] = { key => value.merge(combination[0]) }
|
28
28
|
combination[1] = "#{key}.#{combination[1]}"
|
29
29
|
end
|
30
30
|
combinations += com
|
@@ -9,27 +9,25 @@ module Fitting
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def fully_covered?
|
12
|
+
all_good_documented = false
|
13
|
+
all_good_response_documented = false
|
14
|
+
all_good_response_json_schemas = false
|
15
|
+
all_good_valid_json_schemas = false
|
16
|
+
|
12
17
|
test_file_paths.each do |_key, requests|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
all_good = requests.all?(&:response_documented?)
|
18
|
-
return false unless all_good
|
19
|
-
end
|
20
|
-
test_file_paths.each do |_key, requests|
|
21
|
-
all_good = requests.all?(&:response_json_schemas?)
|
22
|
-
return false unless all_good
|
23
|
-
end
|
24
|
-
test_file_paths.each do |_key, requests|
|
25
|
-
all_good = requests.all?(&:valid_json_schemas?)
|
26
|
-
return false unless all_good
|
18
|
+
all_good_documented = requests.all?(&:documented?)
|
19
|
+
all_good_response_documented = requests.all?(&:response_documented?)
|
20
|
+
all_good_response_json_schemas = requests.all?(&:response_json_schemas?)
|
21
|
+
all_good_valid_json_schemas = requests.all?(&:valid_json_schemas?)
|
27
22
|
end
|
28
|
-
|
23
|
+
|
24
|
+
all_good_documented && all_good_response_documented &&
|
25
|
+
all_good_response_json_schemas && all_good_valid_json_schemas
|
29
26
|
end
|
30
27
|
|
31
28
|
def test_file_paths
|
32
29
|
return @test_file_paths if @test_file_paths
|
30
|
+
|
33
31
|
@test_file_paths = {}
|
34
32
|
white_unit.map do |request|
|
35
33
|
@test_file_paths[request.test_file_path] ||= []
|
@@ -10,11 +10,12 @@ module Fitting
|
|
10
10
|
|
11
11
|
array = []
|
12
12
|
Dir['fitting_tests/*.json'].each do |file|
|
13
|
-
array += JSON.
|
13
|
+
array += JSON.parse(File.read(file))
|
14
14
|
end
|
15
15
|
@to_a = array.inject([]) do |res, tested_request|
|
16
16
|
request = Fitting::Records::Spherical::Request.load(tested_request)
|
17
17
|
next res unless request.path.to_s.start_with?(Fitting.configuration.prefix)
|
18
|
+
|
18
19
|
res.push(request)
|
19
20
|
end
|
20
21
|
end
|
@@ -14,7 +14,7 @@ module Fitting
|
|
14
14
|
def to_hash
|
15
15
|
{
|
16
16
|
status: status,
|
17
|
-
body: JSON.
|
17
|
+
body: JSON.parse(body)
|
18
18
|
}
|
19
19
|
rescue JSON::ParserError
|
20
20
|
{
|
@@ -23,7 +23,7 @@ module Fitting
|
|
23
23
|
}
|
24
24
|
end
|
25
25
|
|
26
|
-
def to_json
|
26
|
+
def to_json(*_args)
|
27
27
|
JSON.dump(to_hash)
|
28
28
|
end
|
29
29
|
|
@@ -37,6 +37,7 @@ module Fitting
|
|
37
37
|
@documented_requests ||= @all_documented_requests.inject([]) do |res, documented_request|
|
38
38
|
next res unless @tested_request.method == documented_request.method &&
|
39
39
|
documented_request.path.match(@tested_request.path.to_s)
|
40
|
+
|
40
41
|
res.push(documented_request)
|
41
42
|
end
|
42
43
|
end
|
@@ -49,6 +50,7 @@ module Fitting
|
|
49
50
|
@documented_responses ||= documented_requests.inject([]) do |res, documented_request|
|
50
51
|
documented_request.responses.map do |documented_response|
|
51
52
|
next unless documented_response['status'] == response.status.to_s
|
53
|
+
|
52
54
|
res.push(documented_response)
|
53
55
|
end
|
54
56
|
end.flatten.compact
|
@@ -71,6 +73,7 @@ module Fitting
|
|
71
73
|
def valid_json_schemas
|
72
74
|
@valid_json_schemas ||= response_json_schemas.inject([]) do |res, json_schema|
|
73
75
|
next res unless JSON::Validator.validate(json_schema, response.body)
|
76
|
+
|
74
77
|
res.push(json_schema)
|
75
78
|
end.flatten
|
76
79
|
end
|
@@ -78,6 +81,7 @@ module Fitting
|
|
78
81
|
def invalid_json_schemas
|
79
82
|
@invalid_json_schemas ||= response_json_schemas.inject([]) do |res, json_schema|
|
80
83
|
next res if JSON::Validator.validate(json_schema, response.body)
|
84
|
+
|
81
85
|
res.push(
|
82
86
|
json_schema: json_schema,
|
83
87
|
fully_validate: JSON::Validator.fully_validate(json_schema, response.body)
|
@@ -28,7 +28,7 @@ module Fitting
|
|
28
28
|
end
|
29
29
|
|
30
30
|
def test_path
|
31
|
-
@test_path ||= @test_title[
|
31
|
+
@test_path ||= @test_title[/\\(\\.(.*?)\\)/m, 1] || @test_title[/\\.(.*?)\\"/m, 1]
|
32
32
|
end
|
33
33
|
|
34
34
|
def test_file_path
|
@@ -14,12 +14,11 @@ module Fitting
|
|
14
14
|
|
15
15
|
def valid_bodies
|
16
16
|
@valid_bodies ||= @bodies.inject([]) do |res, tested_body|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
end
|
17
|
+
next res unless JSON::Validator.validate(@json_schema, tested_body)
|
18
|
+
|
19
|
+
res.push(tested_body)
|
20
|
+
rescue JSON::Schema::UriError
|
21
|
+
res.push(tested_body)
|
23
22
|
end
|
24
23
|
end
|
25
24
|
end
|
@@ -17,50 +17,55 @@ module Fitting
|
|
17
17
|
|
18
18
|
def bodies
|
19
19
|
@bodies ||= @tested_bodies.inject([]) do |res, tested_body|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
end
|
20
|
+
next res unless JSON::Validator.validate(@json_schema, tested_body)
|
21
|
+
|
22
|
+
res.push(tested_body)
|
23
|
+
rescue JSON::Schema::UriError
|
24
|
+
res.push(tested_body)
|
26
25
|
end
|
27
26
|
end
|
28
27
|
|
29
28
|
def combinations
|
30
29
|
return @combinations if @combinations
|
30
|
+
|
31
31
|
@combinations = []
|
32
32
|
cover_json_schema = Fitting::Cover::JSONSchema.new(@json_schema)
|
33
33
|
cover_json_schema.combi.map do |comb|
|
34
34
|
@combinations.push(Fitting::Records::Unit::Combination.new(
|
35
|
-
|
36
|
-
|
37
|
-
|
35
|
+
comb,
|
36
|
+
bodies
|
37
|
+
))
|
38
38
|
end
|
39
39
|
@combinations
|
40
40
|
end
|
41
41
|
|
42
42
|
def combinations_with_enum
|
43
43
|
return @combinations_with_enum if @combinations_with_enum
|
44
|
+
|
44
45
|
@combinations_with_enum = []
|
45
|
-
qwe = Fitting::Cover::JSONSchema.new(@json_schema).combi +
|
46
|
+
qwe = Fitting::Cover::JSONSchema.new(@json_schema).combi +
|
47
|
+
Fitting::Cover::JSONSchemaEnum.new(@json_schema).combi
|
46
48
|
qwe.map do |comb|
|
47
49
|
@combinations_with_enum.push(Fitting::Records::Unit::Combination.new(
|
48
|
-
|
49
|
-
|
50
|
-
|
50
|
+
comb,
|
51
|
+
bodies
|
52
|
+
))
|
51
53
|
end
|
52
54
|
@combinations_with_enum
|
53
55
|
end
|
54
56
|
|
55
57
|
def combinations_with_one_of
|
56
58
|
return @combinations_with_one_of if @combinations_with_one_of
|
59
|
+
|
57
60
|
@combinations_with_one_of = []
|
58
|
-
qwe = Fitting::Cover::JSONSchema.new(@json_schema).combi +
|
61
|
+
qwe = Fitting::Cover::JSONSchema.new(@json_schema).combi +
|
62
|
+
Fitting::Cover::JSONSchemaEnum.new(@json_schema).combi +
|
63
|
+
Fitting::Cover::JSONSchemaOneOf.new(@json_schema).combi
|
59
64
|
qwe.map do |comb|
|
60
65
|
@combinations_with_one_of.push(Fitting::Records::Unit::Combination.new(
|
61
|
-
|
62
|
-
|
63
|
-
|
66
|
+
comb,
|
67
|
+
bodies
|
68
|
+
))
|
64
69
|
end
|
65
70
|
@combinations_with_one_of
|
66
71
|
end
|
@@ -79,26 +84,26 @@ module Fitting
|
|
79
84
|
|
80
85
|
def cover_enum
|
81
86
|
@cover_enum ||= if bodies == []
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
87
|
+
0
|
88
|
+
else
|
89
|
+
count = 0
|
90
|
+
combinations_with_enum.map do |combination|
|
91
|
+
count += 1 unless combination.valid_bodies == []
|
92
|
+
end
|
93
|
+
(count + 1) * 100 / (combinations_with_enum.size + 1)
|
94
|
+
end
|
90
95
|
end
|
91
96
|
|
92
97
|
def cover_one_of
|
93
98
|
@cover_one_of ||= if bodies == []
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
99
|
+
0
|
100
|
+
else
|
101
|
+
count = 0
|
102
|
+
combinations_with_one_of.map do |combination|
|
103
|
+
count += 1 unless combination.valid_bodies == []
|
104
|
+
end
|
105
|
+
(count + 1) * 100 / (combinations_with_one_of.size + 1)
|
106
|
+
end
|
102
107
|
end
|
103
108
|
end
|
104
109
|
end
|
@@ -27,6 +27,7 @@ module Fitting
|
|
27
27
|
@tested_responses ||= @tested_requests.to_a.inject([]) do |res, tested_request|
|
28
28
|
next res unless @documented_request.method == tested_request.method &&
|
29
29
|
@documented_request.path.match(tested_request.path.to_s)
|
30
|
+
|
30
31
|
res.push(tested_request.response)
|
31
32
|
end
|
32
33
|
end
|
@@ -17,9 +17,7 @@ module Fitting
|
|
17
17
|
@action.path.to_s
|
18
18
|
end
|
19
19
|
|
20
|
-
|
21
|
-
@responses
|
22
|
-
end
|
20
|
+
attr_reader :responses, :tests
|
23
21
|
|
24
22
|
def add_test(test)
|
25
23
|
@tests.push(test)
|
@@ -38,14 +36,13 @@ module Fitting
|
|
38
36
|
@regexp = Regexp.new(str)
|
39
37
|
end
|
40
38
|
|
41
|
-
def tests
|
42
|
-
@tests
|
43
|
-
end
|
44
|
-
|
45
39
|
def details
|
46
40
|
{
|
47
|
-
|
48
|
-
|
41
|
+
tests_without_responses: @tests.without_responses,
|
42
|
+
responses_details: @responses.to_a.map do |r|
|
43
|
+
{ method: r.status, tests_size: r.tests.size, json_schema: r.id,
|
44
|
+
combinations: r.details }
|
45
|
+
end
|
49
46
|
}
|
50
47
|
end
|
51
48
|
end
|
@@ -16,14 +16,14 @@ module Fitting
|
|
16
16
|
|
17
17
|
def join(tests)
|
18
18
|
tests.to_a.map do |test|
|
19
|
-
if
|
19
|
+
if there_a_suitable_action?(test)
|
20
20
|
cram_into_the_appropriate_action(test)
|
21
21
|
test.mark_action
|
22
22
|
end
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
-
def
|
26
|
+
def there_a_suitable_action?(test)
|
27
27
|
@actions.map do |action|
|
28
28
|
return true if test.method == action.method && action.path_match(test.path)
|
29
29
|
end
|
@@ -35,15 +35,17 @@ module Fitting
|
|
35
35
|
@actions.map do |action|
|
36
36
|
if test.method == action.method && action.path_match(test.path)
|
37
37
|
action.add_test(test)
|
38
|
-
|
38
|
+
break
|
39
39
|
end
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
43
|
def details(prefix)
|
44
44
|
{
|
45
|
-
|
46
|
-
|
45
|
+
tests_without_actions: prefix.tests.without_actions,
|
46
|
+
actions_details: @actions.map do |a|
|
47
|
+
{ method: a.method, path: a.path, tests_size: a.tests.size, responses: a.details }
|
48
|
+
end
|
47
49
|
}
|
48
50
|
end
|
49
51
|
end
|
@@ -9,26 +9,12 @@ module Fitting
|
|
9
9
|
@id = SecureRandom.hex
|
10
10
|
end
|
11
11
|
|
12
|
-
|
13
|
-
@json_schema
|
14
|
-
end
|
15
|
-
|
16
|
-
def id
|
17
|
-
@id
|
18
|
-
end
|
19
|
-
|
20
|
-
def type
|
21
|
-
@type
|
22
|
-
end
|
12
|
+
attr_reader :json_schema, :id, :type, :tests
|
23
13
|
|
24
14
|
def name
|
25
15
|
@combination
|
26
16
|
end
|
27
17
|
|
28
|
-
def tests
|
29
|
-
@tests
|
30
|
-
end
|
31
|
-
|
32
18
|
def add_test(test)
|
33
19
|
@tests.push(test)
|
34
20
|
end
|
@@ -14,20 +14,21 @@ module Fitting
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def size_with_tests
|
17
|
-
@combinations.count { |c| c.tests.
|
17
|
+
@combinations.count { |c| !c.tests.empty? }
|
18
18
|
end
|
19
19
|
|
20
20
|
def join(tests)
|
21
21
|
tests.to_a.map do |test|
|
22
|
-
if
|
22
|
+
if there_a_suitable_combination?(test)
|
23
23
|
cram_into_the_appropriate_combinations(test)
|
24
24
|
test.mark_combination
|
25
25
|
end
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
-
def
|
29
|
+
def there_a_suitable_combination?(test)
|
30
30
|
return false if @combinations.nil?
|
31
|
+
|
31
32
|
@combinations.map do |combination|
|
32
33
|
return true if JSON::Validator.fully_validate(combination.json_schema, test.body) == []
|
33
34
|
end
|
@@ -37,9 +38,7 @@ module Fitting
|
|
37
38
|
|
38
39
|
def cram_into_the_appropriate_combinations(test)
|
39
40
|
@combinations.map do |combination|
|
40
|
-
if JSON::Validator.fully_validate(combination.json_schema, test.body) == []
|
41
|
-
combination.add_test(test)
|
42
|
-
end
|
41
|
+
combination.add_test(test) if JSON::Validator.fully_validate(combination.json_schema, test.body) == []
|
43
42
|
end
|
44
43
|
end
|
45
44
|
end
|
@@ -31,9 +31,10 @@ module Fitting
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def good?
|
34
|
-
return false
|
35
|
-
return false
|
36
|
-
return false
|
34
|
+
return false unless @tests_without_prefixes.empty?
|
35
|
+
return false unless @tests_without_actions.empty?
|
36
|
+
return false unless @tests_without_responses.empty?
|
37
|
+
|
37
38
|
@good
|
38
39
|
end
|
39
40
|
end
|