Class: ConfigurationService::Test::Orchestrator

Inherits:
Object
  • Object
show all
Defined in:
lib/configuration_service/test/orchestrator.rb

Overview

The declarative test orchestration API

This is the declarative API that describes what must be done to test a configuration service provider. It catalogues all the services that the cucumber step definitions expect from a test orchestration provider.

It keeps no domain state, because that would couple it to the service implementation. By making no assumptions at all about the API or data, it allows implementors to produce service implementations that do not adhere to the anticipated Client API, by writing their own test orchestration provider from scratch instead of extending OrchestrationProvider.

However, implementors who are trying to produce Client providers should extend OrchestrationProvider, which anticipates a compatible provider API.

Note that the @response instance variable is not domain state; it is a test artifact (Response or similar) that orchestration providers use to wrap responses from the configuration service.

Instance Method Summary collapse

Constructor Details

#initialize(provider_class) ⇒ Orchestrator

Returns a new instance of Orchestrator.

Parameters:

  • provider_class (Class)

    the test orchestration provider class, which should have a default/nullary constructor



36
37
38
# File 'lib/configuration_service/test/orchestrator.rb', line 36

def initialize(provider_class)
  @provider = provider_class.new
end

Instance Method Details

#authorize(activity) ⇒ Object

Authorize the next publish or request activity

Where possible, the test orchestration provider should authorize :nothing by providing valid credentials that don’t allow operations on the configuration identifier that it tests against.

Parameters:



101
102
103
104
# File 'lib/configuration_service/test/orchestrator.rb', line 101

def authorize(activity)
  role = role_for(activity) or raise "unknown authorizable activity #{activity.inspect}"
  @provider.authorize(role)
end

#authorize_consumptionObject

Get credentials to consume a configuration



138
139
140
# File 'lib/configuration_service/test/orchestrator.rb', line 138

def authorize_consumption
  @provider.authorize_consumption
end

#bootstrap_configuration_service_environmentallyObject

TODO:

replace with declarative test that delegates to orchestration provider

Bootstrap a configuration service environmentally

Environmental service configuration (as arranged by #given_environmental_service_configuration) is given to an Factory::EnvironmentContext factory to create a service configuration instance.



299
300
301
302
# File 'lib/configuration_service/test/orchestrator.rb', line 299

def bootstrap_configuration_service_environmentally
  context = ConfigurationService::Factory::EnvironmentContext.new(@env, "CFGSRV")
  @service = ConfigurationService::Factory.create_client(context)
end

#bootstrapped_configuration_service_functional?Boolean

TODO:

replace with declarative test that delegates to orchestration provider

Tests that a bootstrapped configuration service is functional

Returns:

  • (Boolean)


309
310
311
312
313
314
315
316
# File 'lib/configuration_service/test/orchestrator.rb', line 309

def bootstrapped_configuration_service_functional?
  response = begin
               ConfigurationService::Test::Response::Success.new(@service.request_configuration(identifier: 'test'))
             rescue ConfigurationService::Error => e
               ConfigurationService::Test::Response::Failure.new(e)
             end
  !response.failed?
end

#configuration_found_for_identifier?Boolean

Configuration for the requested identifier was found

The test orchestration provider should verify that the returned configuration is for the requested identifier.

Returns:

  • (Boolean)


167
168
169
# File 'lib/configuration_service/test/orchestrator.rb', line 167

def configuration_found_for_identifier?
  @provider.configuration_found_for_identifier?
end

#credentials_allow_consumption?Boolean

Returns:

  • (Boolean)


142
143
144
145
# File 'lib/configuration_service/test/orchestrator.rb', line 142

def credentials_allow_consumption?
  @response = @provider.credentials_allow_consumption?
  request_allowed?
end

#credentials_allow_publication?Boolean

Returns:

  • (Boolean)


147
148
149
150
# File 'lib/configuration_service/test/orchestrator.rb', line 147

def credentials_allow_publication?
  @response = @provider.credentials_allow_publication?
  request_allowed?
end

#credentials_allow_reference_consumption?Boolean

Returns:

  • (Boolean)


152
153
154
155
# File 'lib/configuration_service/test/orchestrator.rb', line 152

def credentials_allow_reference_consumption?
  @responses = @provider.credentials_allow_reference_consumption?
  requests_allowed?
end

#credentials_allow_reference_publication?Boolean

Returns:

  • (Boolean)


157
158
159
160
# File 'lib/configuration_service/test/orchestrator.rb', line 157

def credentials_allow_reference_publication?
  @responses = @provider.credentials_allow_reference_publication?
  requests_allowed?
end

#deauthorizeObject

Remove any previous authorization

E.g. as arranged by #authorize.



111
112
113
# File 'lib/configuration_service/test/orchestrator.rb', line 111

def deauthorize
  @provider.deauthorize
end

#environmental_service_configuration_scrubbed?Boolean

TODO:

replace with declarative test that delegates to orchestration provider

Tests that environmental service configuration is scrubbed

Returns:

  • (Boolean)


323
324
325
# File 'lib/configuration_service/test/orchestrator.rb', line 323

def environmental_service_configuration_scrubbed?
  !@env.include?("CFGSRV_TOKEN")
end

#existing_revisionObject

TODO:

replace with predicate: this exposes domain state

Return the revision of a published configuration fixture

E.g. as arranged by #given_existing_configuration.



83
84
85
# File 'lib/configuration_service/test/orchestrator.rb', line 83

def existing_revision
  @provider.existing_revision
end

#given_environmental_service_configurationObject

TODO:

replace with declarative test that delegates to orchestration provider

Arrange environmental service configuration

Environmental service configuration is configuration for bootstrapping a configuration service and provider.



279
280
281
282
283
284
285
286
287
288
289
# File 'lib/configuration_service/test/orchestrator.rb', line 279

def given_environmental_service_configuration
  sp_env = @provider.service_provider_configuration.inject({}) do |m, (k, v)|
    m["CFGSRV_PROVIDER_#{k.to_s.upcase}"] = v
    m
  end
  @env = {
    "CFGSRV_IDENTIFIER" => "acme",
    "CFGSRV_TOKEN" => "ea81cbfb-221c-41ad-826e-d3eff6342345",
    "CFGSRV_PROVIDER" => @provider.service_provider_id,
  }.merge(sp_env)
end

#given_existing_configurationObject

Arrange a published configuration fixture



50
51
52
# File 'lib/configuration_service/test/orchestrator.rb', line 50

def given_existing_configuration
  @provider.given_existing_configuration
end

#given_existing_configuration_containing_referencesObject



54
55
56
# File 'lib/configuration_service/test/orchestrator.rb', line 54

def given_existing_configuration_containing_references
  @provider.given_existing_configuration_containing_references
end

#given_invalid_configurationObject

Use invalid configuration data in the next publishing operation



65
66
67
# File 'lib/configuration_service/test/orchestrator.rb', line 65

def given_invalid_configuration
  @provider.given_invalid_configuration
end

#given_metadataObject

Include metadata in the next publishing operation



43
44
45
# File 'lib/configuration_service/test/orchestrator.rb', line 43

def 
  @provider.
end

#given_missing_configurationObject

Delete any existing configuration



72
73
74
# File 'lib/configuration_service/test/orchestrator.rb', line 72

def given_missing_configuration
  @provider.given_missing_configuration
end

#given_publication_failureObject

Arrange for the next publication operation to fail



260
261
262
# File 'lib/configuration_service/test/orchestrator.rb', line 260

def given_publication_failure
  @provider.fail_next_request
end

#given_referenced_configuration_existsObject



58
59
60
# File 'lib/configuration_service/test/orchestrator.rb', line 58

def given_referenced_configuration_exists
  @provider.given_referenced_configuration_exists
end

#given_request_failureObject

Arrange for the next consuming operation to fail



267
268
269
# File 'lib/configuration_service/test/orchestrator.rb', line 267

def given_request_failure
  @provider.fail_next_request
end

#publish_configurationObject

Publish configuration through the service under test

The test orchestration provider is expected to wrap the response in a Response (or simimlar) and return that.



131
132
133
# File 'lib/configuration_service/test/orchestrator.rb', line 131

def publish_configuration
  @response = @provider.publish_configuration
end

#published_configurationHash Also known as: requested_configuration

TODO:

replace with predicate: this exposes domain state

The last published or consumed configuration data

Returns:



230
231
232
# File 'lib/configuration_service/test/orchestrator.rb', line 230

def published_configuration
  @response.data
end

#published_metadataHash

TODO:

replace with predicate: this exposes domain state

The last published metadata

Returns:

  • (Hash)

    configuration metadata



253
254
255
# File 'lib/configuration_service/test/orchestrator.rb', line 253

def 
  @response.
end

#published_revisionString

TODO:

replace with predicate: this exposes domain state

The revision of the last published or consumed configuration metadata

Returns:

  • (String)

    metadata revision



242
243
244
# File 'lib/configuration_service/test/orchestrator.rb', line 242

def published_revision
  @response.revision
end

#references_replaced_with_configuration_data?Boolean

Returns:

  • (Boolean)


171
172
173
# File 'lib/configuration_service/test/orchestrator.rb', line 171

def references_replaced_with_configuration_data?
  @provider.references_replaced_with_configuration_data?
end

#request_allowed?Boolean

Whether the last publish or request was allowed



181
182
183
# File 'lib/configuration_service/test/orchestrator.rb', line 181

def request_allowed?
  @response.allowed?
end

#request_configurationObject

Request configuration from the service under test

The test orchestration provider is expected to wrap the response in a Response (or simimlar) and return that.



121
122
123
# File 'lib/configuration_service/test/orchestrator.rb', line 121

def request_configuration
  @response = @provider.request_configuration
end

#request_failed?Boolean

Whether the last publish or request was allowed but failed



197
198
199
# File 'lib/configuration_service/test/orchestrator.rb', line 197

def request_failed?
  @response.failed?
end

#request_not_found?Boolean

True if the last request not return configuration data

Returns:

  • (Boolean)

See Also:



207
208
209
# File 'lib/configuration_service/test/orchestrator.rb', line 207

def request_not_found?
  not @response.found?
end

#request_not_matched?Boolean

TODO:

distinguish #request_not_matched? to mean “found data, but filtered out by metadata filter”

True if the last request did consuming operation did not return data

Returns:

  • (Boolean)

See Also:



219
220
221
# File 'lib/configuration_service/test/orchestrator.rb', line 219

def request_not_matched?
  not @response.found?
end

#requests_allowed?Boolean

Returns:

  • (Boolean)


185
186
187
188
189
# File 'lib/configuration_service/test/orchestrator.rb', line 185

def requests_allowed?
  @responses.all? { |response| 
    response.allowed?
  }
end