et_fake_ccd 1.1.3 → 1.1.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 715abb41a7a8c8b03d511144100c3c850bdf0c28ac692ff4035fe4f1e98fbd20
4
- data.tar.gz: 610bfb8032916563890b8078e433ad7db24b7d42ba623d2e01579432f9fe489d
3
+ metadata.gz: e5968450f9fb5c522a5ef2843d74bd516795565a7e0ea2db74b99f535b3b218b
4
+ data.tar.gz: 7ef2bf4693eda7b6c427a5ddb4597de610c0d5b30eda626af7e94e735e50b242
5
5
  SHA512:
6
- metadata.gz: 5b0c423548802001cad2d385821ad76aae05a760e00152fac1fb7fc5864246401ac98bd70267c93cf9e744831ca6abf96dcb3056f99cf0e157ae3504908732fb
7
- data.tar.gz: 29bdc2795a91160e1bdd654d5b10a83074f568a10d0a63e69e8509c318fd1fe4d527607b806918b68019c6ec7a407b49a07b2eac3c66deaa1c0b60cf6af2a41e
6
+ metadata.gz: ec1cd2619dab545b1c59a681c4396da960296eaf31c1a56b5c4c8b085f0c87d9151e75bd181a2a1a5df90697f7b54c8a5696ec944b106133a352e04baefcf574
7
+ data.tar.gz: 23102b8a755b256725c001afd3ea9b7fc87afe645dec8e6dc61278c89cf44ab239a912118153e8da46fa094627f8edd417c7c4063e2d15eba131c63369b53501
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- et_fake_ccd (1.1.3)
4
+ et_fake_ccd (1.1.4)
5
5
  activemodel (>= 5.2.3)
6
6
  iodine (~> 0.7)
7
7
  json-schema (~> 2.5)
@@ -13,9 +13,9 @@ PATH
13
13
  GEM
14
14
  remote: https://rubygems.org/
15
15
  specs:
16
- activemodel (6.1.1)
17
- activesupport (= 6.1.1)
18
- activesupport (6.1.1)
16
+ activemodel (6.1.3.1)
17
+ activesupport (= 6.1.3.1)
18
+ activesupport (6.1.3.1)
19
19
  concurrent-ruby (~> 1.0, >= 1.0.2)
20
20
  i18n (>= 1.6, < 2)
21
21
  minitest (>= 5.1)
@@ -23,18 +23,18 @@ GEM
23
23
  zeitwerk (~> 2.3)
24
24
  addressable (2.7.0)
25
25
  public_suffix (>= 2.0.2, < 5.0)
26
- concurrent-ruby (1.1.7)
26
+ concurrent-ruby (1.1.8)
27
27
  diff-lcs (1.3)
28
- i18n (1.8.7)
28
+ i18n (1.8.10)
29
29
  concurrent-ruby (~> 1.0)
30
- iodine (0.7.43)
30
+ iodine (0.7.44)
31
31
  json-schema (2.8.1)
32
32
  addressable (>= 2.4)
33
- minitest (5.14.3)
33
+ minitest (5.14.4)
34
34
  public_suffix (4.0.6)
35
35
  rack (2.2.3)
36
36
  rake (13.0.1)
37
- roda (3.40.0)
37
+ roda (3.43.1)
38
38
  rack
39
39
  rotp (6.2.0)
40
40
  rspec (3.9.0)
@@ -50,7 +50,7 @@ GEM
50
50
  diff-lcs (>= 1.2.0, < 2.0)
51
51
  rspec-support (~> 3.9.0)
52
52
  rspec-support (3.9.2)
53
- thor (1.0.1)
53
+ thor (1.1.0)
54
54
  tilt (2.0.10)
55
55
  tzinfo (2.0.4)
56
56
  concurrent-ruby (~> 1.0)
data/README.md CHANGED
@@ -97,7 +97,74 @@ So, here is a list of deliberate errors that Im sure will increase in size :-
97
97
  * Use the lead claimant title of "Mr" to only force the error on the first occurence
98
98
  * Use the lead claimant title of "Mrs" to force the error on every occurence
99
99
 
100
+ ### Improved Deliberate Error Control
100
101
 
102
+ The above deliberate error mechanism worked, it does not give quite enough control.
103
+
104
+ A new system has therefore been developed that you can use instead of it.
105
+
106
+ This uses special configuration settings in the 'External System' in the admin.
107
+
108
+ There are 2 key entries
109
+
110
+ 1. 'extra_headers'
111
+ 2. 'send_request_id'
112
+
113
+ #### extra_headers
114
+
115
+ 'extra_headers' should contain a JSON encoded value of a hash. Each entry in the hash is a header
116
+ to add to every request to this fake ccd server.
117
+
118
+ ##### force_failures header
119
+
120
+ The force_failures header should contain a hash which looks like this
121
+
122
+ ```json
123
+ {
124
+ "idam_stage": { ..spec.. },
125
+ "token_stage": { ..spec.. },
126
+ "data_stage": { ..spec.. }
127
+ }
128
+
129
+ ```
130
+
131
+ The 4 different stages give control of when the error will happen
132
+
133
+ The 'idam_stage' is the stage of the transaction when an IDAM token is requested.
134
+ However, this does not happen all of the time because IDAM tokens are cached, so
135
+ you will not necessarily see one request per transaction.
136
+
137
+ The 'token_stage' is used in most transactions such as case creation
138
+ where a 'token' is the starting stage - which then allows the case
139
+ to be created against this token.
140
+
141
+ The 'documents' stage is used in transactions that require documents uploading before the
142
+ case is created.
143
+
144
+ The 'data_stage' is used in most transactions and means the actual data
145
+ creation.
146
+
147
+ The '..spec..' is the same irrespective of which stage and is described below:
148
+
149
+ ```json
150
+ [a, b, c]
151
+ ```
152
+
153
+ a, b, c (you can specify as many as you want here, not just 3)
154
+ are http response codes for the 'nth' request. i.e. the first argument
155
+ is for the first request, the 2nd for the 2nd etc..
156
+ The special value of 0 means allow the normal response and do not force an
157
+ error - allowing for patterns such as error on the 1st, 2nd and 5th.
158
+
159
+ Any non zero value is the http status code to respond with.
160
+
161
+ #### send_request_id
162
+
163
+ 'send_request_id' should be set to 'true' to enable a request identifier to be sent with every
164
+ request to this fake ccd server. This identifier is unique to a particular export from the main system,
165
+ so it will persist even across retries of the same export.
166
+
167
+ This is then used to assist in special rules where errors are forced on the 'nth' request for example.
101
168
 
102
169
 
103
170
  ## Development
@@ -0,0 +1,20 @@
1
+ require 'et_fake_ccd/request_store_service'
2
+ module EtFakeCcd
3
+ module ForcedErrorHandling
4
+ extend ActiveSupport::Concern
5
+
6
+ def with_forced_error_handling(r, stage:)
7
+ request_id = r.headers['request_id']
8
+ RequestStoreService.store "#{stage}-#{request_id}" unless request_id.nil?
9
+ count = request_id.nil? ? 1 : RequestStoreService.count("#{stage}-#{request_id}")
10
+ specs = JSON.parse(r.headers['force_failures'] || '{}')
11
+ spec = specs.fetch("#{stage}_stage", [])
12
+ response_code = spec[count - 1].to_i
13
+ if response_code.zero?
14
+ yield
15
+ else
16
+ r.halt response_code
17
+ end
18
+ end
19
+ end
20
+ end
@@ -9,12 +9,14 @@ module EtFakeCcd
9
9
  plugin :halt
10
10
  route do |r|
11
11
  r.is "lease" do
12
- r.post do
13
- command = ::EtFakeCcd::Command::LeaseCommand.from_json JSON.parse(r.body.read)
14
- if command.valid?
15
- ::EtFakeCcd::AuthService.generate_service_token
16
- else
17
- r.halt 403, render_error_for(command)
12
+ with_forced_error_handling(r, stage: :token) do
13
+ r.post do
14
+ command = ::EtFakeCcd::Command::LeaseCommand.from_json JSON.parse(r.body.read)
15
+ if command.valid?
16
+ ::EtFakeCcd::AuthService.generate_service_token
17
+ else
18
+ r.halt 403, render_error_for(command)
19
+ end
18
20
  end
19
21
  end
20
22
  end
@@ -11,15 +11,19 @@ module EtFakeCcd
11
11
  route do |r|
12
12
  r.is "login" do
13
13
  r.get do
14
- file = File.absolute_path(File.join('..', 'views', 'login.html.erb'), __dir__)
15
- render(path: file, locals: { oauth2_redirect_url: config.oauth2_redirect_url, oauth2_client_id: config.oauth2_client_id })
14
+ with_forced_error_handling(r, stage: :token) do
15
+ file = File.absolute_path(File.join('..', 'views', 'login.html.erb'), __dir__)
16
+ render(path: file, locals: { oauth2_redirect_url: config.oauth2_redirect_url, oauth2_client_id: config.oauth2_client_id })
17
+ end
16
18
  end
17
19
  r.post do
18
- command = ::EtFakeCcd::Command::LoginUserCommand.from_json(r.params)
19
- if command.valid?
20
- r.redirect "/case-management-web/oauth2redirect?code=pfSHb6v4dEDEfqqP"
21
- else
22
- r.halt 401, "Access Denied"
20
+ with_forced_error_handling(r, stage: :token) do
21
+ command = ::EtFakeCcd::Command::LoginUserCommand.from_json(r.params)
22
+ if command.valid?
23
+ r.redirect "/case-management-web/oauth2redirect?code=pfSHb6v4dEDEfqqP"
24
+ else
25
+ r.halt 401, "Access Denied"
26
+ end
23
27
  end
24
28
  end
25
29
  end
@@ -1,96 +1,109 @@
1
1
  require 'roda'
2
2
  require 'json'
3
3
  require 'et_fake_ccd/commands'
4
+ require 'et_fake_ccd/forced_error_handling'
4
5
  require 'et_fake_ccd/auth_service'
5
6
  require 'et_fake_ccd/data_store_service'
6
7
  require 'et_fake_ccd/request_store_service'
7
8
  module EtFakeCcd
8
9
  module Service
9
10
  class DataStoreApp < Roda
11
+ include ForcedErrorHandling
10
12
  plugin :request_headers
11
13
  plugin :halt
12
14
  route do |r|
13
15
  r.is "caseworkers", String, "jurisdictions", String, "case-types", String, "event-triggers", "initiateCase", "token" do |uid, jid, ctid|
14
16
  r.get do
15
- if EtFakeCcd::AuthService.validate_service_token(r.headers['ServiceAuthorization'].gsub(/\ABearer /, '')) && EtFakeCcd::AuthService.validate_user_token(r.headers['Authorization'].gsub(/\ABearer /, ''))
16
- initiate_case(uid, jid, ctid)
17
- else
18
- r.halt 403, forbidden_error_for(r)
17
+ with_forced_error_handling(r, stage: :token) do
18
+ if EtFakeCcd::AuthService.validate_service_token(r.headers['ServiceAuthorization'].gsub(/\ABearer /, '')) && EtFakeCcd::AuthService.validate_user_token(r.headers['Authorization'].gsub(/\ABearer /, ''))
19
+ initiate_case(uid, jid, ctid)
20
+ else
21
+ r.halt 403, forbidden_error_for(r)
22
+ end
19
23
  end
20
24
  end
21
25
  end
22
26
  r.is "caseworkers", String, "jurisdictions", String, "case-types", String, "event-triggers", "createMultiple", "token" do |uid, jid, ctid|
23
27
  r.get do
24
- if EtFakeCcd::AuthService.validate_service_token(r.headers['ServiceAuthorization'].gsub(/\ABearer /, '')) && EtFakeCcd::AuthService.validate_user_token(r.headers['Authorization'].gsub(/\ABearer /, ''))
25
- initiate_bulk_case(uid, jid, ctid)
26
- else
27
- r.halt 403, forbidden_error_for(r)
28
+ with_forced_error_handling(r, stage: :token) do
29
+ if EtFakeCcd::AuthService.validate_service_token(r.headers['ServiceAuthorization'].gsub(/\ABearer /, '')) && EtFakeCcd::AuthService.validate_user_token(r.headers['Authorization'].gsub(/\ABearer /, ''))
30
+ initiate_bulk_case(uid, jid, ctid)
31
+ else
32
+ r.halt 403, forbidden_error_for(r)
33
+ end
28
34
  end
29
35
  end
30
36
  end
31
37
  r.is "caseworkers", String, "jurisdictions", String, "case-types", String, "cases", String, "event-triggers", "uploadDocument", "token" do |uid, jid, ctid, cid|
32
38
  r.get do
33
- if EtFakeCcd::AuthService.validate_service_token(r.headers['ServiceAuthorization'].gsub(/\ABearer /, '')) && EtFakeCcd::AuthService.validate_user_token(r.headers['Authorization'].gsub(/\ABearer /, ''))
34
- initiate_upload_document(uid, jid, ctid, cid)
35
- else
36
- r.halt 403, forbidden_error_for(r)
39
+ with_forced_error_handling(r, stage: :documents) do
40
+ if EtFakeCcd::AuthService.validate_service_token(r.headers['ServiceAuthorization'].gsub(/\ABearer /, '')) && EtFakeCcd::AuthService.validate_user_token(r.headers['Authorization'].gsub(/\ABearer /, ''))
41
+ initiate_upload_document(uid, jid, ctid, cid)
42
+ else
43
+ r.halt 403, forbidden_error_for(r)
44
+ end
37
45
  end
38
46
  end
39
47
  end
40
48
  r.is "caseworkers", String, "jurisdictions", String, "case-types", String, "cases", String, "events" do |uid, jid, ctid, cid|
41
49
  r.post do
42
- if !EtFakeCcd::AuthService.validate_service_token(r.headers['ServiceAuthorization'].gsub(/\ABearer /, '')) || !EtFakeCcd::AuthService.validate_user_token(r.headers['Authorization'].gsub(/\ABearer /, ''))
43
- r.halt 403, forbidden_error_for(r)
44
- break
50
+ with_forced_error_handling(r, stage: :documents) do
51
+ if !EtFakeCcd::AuthService.validate_service_token(r.headers['ServiceAuthorization'].gsub(/\ABearer /, '')) || !EtFakeCcd::AuthService.validate_user_token(r.headers['Authorization'].gsub(/\ABearer /, ''))
52
+ r.halt 403, forbidden_error_for(r)
53
+ break
54
+ end
55
+ json = JSON.parse(r.body.read)
56
+ command = case json.dig('event', 'id')
57
+ when 'uploadDocument' then ::EtFakeCcd::Command::UploadDocumentsToCaseCommand.from_json json
58
+ else
59
+ r.halt 400, unknown_event_error_for(r)
60
+ end
61
+ if command.valid?
62
+ ::EtFakeCcd::DataStoreService.update_case_data(json, jid: jid, ctid: ctid, cid: cid)
63
+ case_updated_response(cid, uid, jid, ctid)
64
+ else
65
+ r.halt 422, render_error_for(command, r)
66
+ end
45
67
  end
46
- json = JSON.parse(r.body.read)
47
- command = case json.dig('event', 'id')
48
- when 'uploadDocument' then ::EtFakeCcd::Command::UploadDocumentsToCaseCommand.from_json json
49
- else
50
- r.halt 400, unknown_event_error_for(r)
51
- end
52
- if command.valid?
53
- ::EtFakeCcd::DataStoreService.update_case_data(json, jid: jid, ctid: ctid, cid: cid)
54
- case_updated_response(cid, uid, jid, ctid)
55
- else
56
- r.halt 422, render_error_for(command, r)
57
- end
58
-
59
68
  end
60
69
  end
61
70
  r.is "caseworkers", String, "jurisdictions", String, "case-types", String, "cases" do |uid, jid, ctid|
62
71
  r.post do
63
- if !EtFakeCcd::AuthService.validate_service_token(r.headers['ServiceAuthorization'].gsub(/\ABearer /, '')) || !EtFakeCcd::AuthService.validate_user_token(r.headers['Authorization'].gsub(/\ABearer /, ''))
64
- r.halt 403, forbidden_error_for(r)
65
- break
66
- end
67
- json = JSON.parse(r.body.read)
68
- next if force_deliberate_error(json, r)
72
+ with_forced_error_handling(r, stage: :data) do
73
+ if !EtFakeCcd::AuthService.validate_service_token(r.headers['ServiceAuthorization'].gsub(/\ABearer /, '')) || !EtFakeCcd::AuthService.validate_user_token(r.headers['Authorization'].gsub(/\ABearer /, ''))
74
+ r.halt 403, forbidden_error_for(r)
75
+ break
76
+ end
77
+ json = JSON.parse(r.body.read)
78
+ next if force_deliberate_error(json, r)
69
79
 
70
- command = case json.dig('event', 'id')
71
- when 'initiateCase' then ::EtFakeCcd::Command::CreateCaseCommand.from_json json
72
- when 'createMultiple' then ::EtFakeCcd::Command::CreateMultipleCaseCommand.from_json json
73
- else
74
- r.halt 400, unknown_event_error_for(r)
75
- end
76
- if command.valid?
77
- id = ::EtFakeCcd::DataStoreService.store_case_data(command.data, jid: jid, ctid: ctid)
78
- case_created_response(id, uid, jid, ctid)
79
- else
80
- r.halt 422, render_error_for(command, r)
80
+ command = case json.dig('event', 'id')
81
+ when 'initiateCase' then ::EtFakeCcd::Command::CreateCaseCommand.from_json json
82
+ when 'createMultiple' then ::EtFakeCcd::Command::CreateMultipleCaseCommand.from_json json
83
+ else
84
+ r.halt 400, unknown_event_error_for(r)
85
+ end
86
+ if command.valid?
87
+ id = ::EtFakeCcd::DataStoreService.store_case_data(command.data, jid: jid, ctid: ctid)
88
+ case_created_response(id, uid, jid, ctid)
89
+ else
90
+ r.halt 422, render_error_for(command, r)
91
+ end
81
92
  end
82
93
  end
83
94
 
84
95
  r.get do
85
- if !EtFakeCcd::AuthService.validate_service_token(r.headers['ServiceAuthorization'].gsub(/\ABearer /, '')) || !EtFakeCcd::AuthService.validate_user_token(r.headers['Authorization'].gsub(/\ABearer /, ''))
86
- r.halt 403, forbidden_error_for(r)
87
- break
96
+ with_forced_error_handling(r, stage: :data) do
97
+ if !EtFakeCcd::AuthService.validate_service_token(r.headers['ServiceAuthorization'].gsub(/\ABearer /, '')) || !EtFakeCcd::AuthService.validate_user_token(r.headers['Authorization'].gsub(/\ABearer /, ''))
98
+ r.halt 403, forbidden_error_for(r)
99
+ break
100
+ end
101
+ filters = r.params.dup
102
+ page = (filters.delete('page') || "1").to_i
103
+ sort_direction = filters.delete('sortDirection') || 'asc'
104
+ list = DataStoreService.list(jid: jid, ctid: ctid, filters: filters, page: page, sort_direction: sort_direction, page_size: 25)
105
+ cases_response(list, uid, jid, ctid)
88
106
  end
89
- filters = r.params.dup
90
- page = (filters.delete('page') || "1").to_i
91
- sort_direction = filters.delete('sortDirection') || 'asc'
92
- list = DataStoreService.list(jid: jid, ctid: ctid, filters: filters, page: page, sort_direction: sort_direction, page_size: 25)
93
- cases_response(list, uid, jid, ctid)
94
107
  end
95
108
  end
96
109
  end
@@ -13,27 +13,31 @@ module EtFakeCcd
13
13
  route do |r|
14
14
  r.is "documents" do
15
15
  r.post do
16
- unless EtFakeCcd::AuthService.validate_service_token(r.headers['ServiceAuthorization'].gsub(/\ABearer /, '')) && EtFakeCcd::AuthService.validate_user_token(r.headers['Authorization'].gsub(/\ABearer /, ''))
17
- r.halt 403, forbidden_error_for(r)
18
- break
19
- end
20
- command = ::EtFakeCcd::Command::UploadDocumentCommand.from_json(r.params.deep_stringify_keys)
21
- unless command.valid?
22
- r.halt 422, render_error_for(command, r)
23
- break
24
- end
16
+ with_forced_error_handling(r, stage: :documents) do
17
+ unless EtFakeCcd::AuthService.validate_service_token(r.headers['ServiceAuthorization'].gsub(/\ABearer /, '')) && EtFakeCcd::AuthService.validate_user_token(r.headers['Authorization'].gsub(/\ABearer /, ''))
18
+ r.halt 403, forbidden_error_for(r)
19
+ break
20
+ end
21
+ command = ::EtFakeCcd::Command::UploadDocumentCommand.from_json(r.params.deep_stringify_keys)
22
+ unless command.valid?
23
+ r.halt 422, render_error_for(command, r)
24
+ break
25
+ end
25
26
 
26
- upload_document(r)
27
+ upload_document(r)
28
+ end
27
29
  end
28
30
  end
29
31
  r.is "documents", String, "binary" do |uuid|
30
- r.get do
31
- file = ::EtFakeCcd::DocumentStoreService.find_file_by_id(uuid)
32
- unless file
33
- r.halt 404, not_found_error_for(r)
34
- break
32
+ with_forced_error_handling(r, stage: :documents) do
33
+ r.get do
34
+ file = ::EtFakeCcd::DocumentStoreService.find_file_by_id(uuid)
35
+ unless file
36
+ r.halt 404, not_found_error_for(r)
37
+ break
38
+ end
39
+ send_file file.path
35
40
  end
36
- send_file file.path
37
41
  end
38
42
  end
39
43
  end
@@ -11,17 +11,19 @@ module EtFakeCcd
11
11
  route do |r|
12
12
  r.is "generateCaseRefNumbers" do
13
13
  r.post do
14
- unless EtFakeCcd::AuthService.validate_service_token(r.headers['ServiceAuthorization'].gsub(/\ABearer /, '')) && EtFakeCcd::AuthService.validate_user_token(r.headers['Authorization'].gsub(/\ABearer /, ''))
15
- r.halt 403, forbidden_error_for(r)
16
- break
17
- end
18
- json = JSON.parse(r.body.read)
19
- command = ::EtFakeCcd::Command::StartMultipleCommand.from_json json
20
- if command.valid?
21
- response = ::EtFakeCcd::EcmService.start_multiple(command)
22
- start_multiple_response(response)
23
- else
24
- r.halt 422, render_error_for(command, r)
14
+ with_forced_error_handling(r, stage: :data) do
15
+ unless EtFakeCcd::AuthService.validate_service_token(r.headers['ServiceAuthorization'].gsub(/\ABearer /, '')) && EtFakeCcd::AuthService.validate_user_token(r.headers['Authorization'].gsub(/\ABearer /, ''))
16
+ r.halt 403, forbidden_error_for(r)
17
+ break
18
+ end
19
+ json = JSON.parse(r.body.read)
20
+ command = ::EtFakeCcd::Command::StartMultipleCommand.from_json json
21
+ if command.valid?
22
+ response = ::EtFakeCcd::EcmService.start_multiple(command)
23
+ start_multiple_response(response)
24
+ else
25
+ r.halt 422, render_error_for(command, r)
26
+ end
25
27
  end
26
28
  end
27
29
  end
@@ -10,17 +10,21 @@ module EtFakeCcd
10
10
  route do |r|
11
11
  r.is "loginUser" do
12
12
  r.post do
13
- command = ::EtFakeCcd::Command::LoginUserCommand.from_json(r.params)
14
- if command.valid?
15
- logged_in_result
16
- else
17
- r.halt 401, render_error_for(command)
13
+ with_forced_error_handling(r, stage: :token) do
14
+ command = ::EtFakeCcd::Command::LoginUserCommand.from_json(r.params)
15
+ if command.valid?
16
+ logged_in_result
17
+ else
18
+ r.halt 401, render_error_for(command)
19
+ end
18
20
  end
19
21
  end
20
22
  end
21
23
  r.is "details" do
22
24
  r.get do
23
- details_result
25
+ with_forced_error_handling(r, stage: :token) do
26
+ details_result
27
+ end
24
28
  end
25
29
  end
26
30
  end
@@ -1,3 +1,3 @@
1
1
  module EtFakeCcd
2
- VERSION = "1.1.3"
2
+ VERSION = "1.1.4"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: et_fake_ccd
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.3
4
+ version: 1.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gary Taylor
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-01-18 00:00:00.000000000 Z
11
+ date: 2021-04-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: roda
@@ -192,6 +192,7 @@ files:
192
192
  - lib/et_fake_ccd/data_store_service.rb
193
193
  - lib/et_fake_ccd/document_store_service.rb
194
194
  - lib/et_fake_ccd/ecm_service.rb
195
+ - lib/et_fake_ccd/forced_error_handling.rb
195
196
  - lib/et_fake_ccd/iodine.rb
196
197
  - lib/et_fake_ccd/request_store_service.rb
197
198
  - lib/et_fake_ccd/root_app.rb
@@ -225,8 +226,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
225
226
  - !ruby/object:Gem::Version
226
227
  version: '0'
227
228
  requirements: []
228
- rubyforge_project:
229
- rubygems_version: 2.7.6
229
+ rubygems_version: 3.1.4
230
230
  signing_key:
231
231
  specification_version: 4
232
232
  summary: Fake CCD server for employment tribunals