aviator 0.0.2 → 0.0.3

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.
Files changed (71) hide show
  1. data/README.md +9 -1
  2. data/aviator.gemspec +1 -1
  3. data/bin/aviator +6 -86
  4. data/lib/aviator/core/cli/describer.rb +95 -0
  5. data/lib/aviator/core/cli.rb +1 -0
  6. data/lib/aviator/core/request.rb +62 -65
  7. data/lib/aviator/core/service.rb +26 -41
  8. data/lib/aviator/core/session.rb +7 -0
  9. data/lib/aviator/core.rb +1 -0
  10. data/lib/aviator/openstack/compute/v2/public/list_images.rb +51 -42
  11. data/lib/aviator/openstack/compute/v2/public/list_servers.rb +58 -0
  12. data/lib/aviator/openstack/identity/v2/admin/create_tenant.rb +43 -32
  13. data/lib/aviator/openstack/identity/v2/admin/list_tenants.rb +49 -38
  14. data/lib/aviator/openstack/identity/v2/public/create_token.rb +53 -47
  15. data/lib/aviator/openstack/identity/v2/public/list_tenants.rb +36 -26
  16. data/lib/aviator/version.rb +1 -1
  17. data/lib/aviator.rb +1 -0
  18. data/test/aviator/core/cli/describer_test.rb +140 -0
  19. data/test/aviator/core/request_test.rb +132 -157
  20. data/test/aviator/core/service_test.rb +49 -26
  21. data/test/aviator/core/session_test.rb +29 -0
  22. data/test/aviator/openstack/compute/v2/public/list_images_test.rb +16 -18
  23. data/test/aviator/openstack/compute/v2/public/list_servers_test.rb +178 -0
  24. data/test/aviator/openstack/identity/v2/admin/create_tenant_test.rb +10 -12
  25. data/test/aviator/openstack/identity/v2/public/create_token_test.rb +12 -14
  26. data/test/cassettes/core/service/i_default_session_data_/sets_the_service_s_default_session_data.yml +1 -1
  27. data/test/cassettes/core/service/i_request/accepts_an_endpoint_type_option_for_selecting_a_specific_request.yml +1 -1
  28. data/test/cassettes/core/service/i_request/can_find_the_correct_request_based_on_bootstrapped_session_data.yml +1 -1
  29. data/test/cassettes/core/service/i_request/can_find_the_correct_request_based_on_non-bootstrapped_session_data.yml +1 -1
  30. data/test/cassettes/core/service/i_request/can_find_the_correct_request_if_api_version_is_not_defined_but_can_be_inferred_from_host_uri.yml +1 -1
  31. data/test/cassettes/core/service/i_request/uses_the_default_session_data_if_session_data_is_not_provided.yml +1 -1
  32. data/test/cassettes/core/session/c_load/creates_a_new_instance_from_the_given_session_dump.yml +1 -1
  33. data/test/cassettes/core/session/c_load/uses_the_loaded_auth_info_for_its_services.yml +1 -1
  34. data/test/cassettes/core/session/c_new/directs_log_entries_to_the_given_log_file.yml +1 -1
  35. data/test/cassettes/core/session/i_authenticate/authenticates_against_the_auth_service_indicated_in_the_config_file.yml +1 -1
  36. data/test/cassettes/core/session/i_authenticate/authenticates_against_the_auth_service_using_the_credentials_in_the_given_block.yml +1 -1
  37. data/test/cassettes/core/session/i_authenticate/updates_the_session_data_of_its_service_objects.yml +2 -2
  38. data/test/cassettes/core/session/i_dump/serializes_the_session_data_for_caching.yml +1 -1
  39. data/test/cassettes/core/session/i_load/returns_itself.yml +63 -0
  40. data/test/cassettes/core/session/i_load/updates_the_session_data_of_its_service_objects.yml +123 -0
  41. data/test/cassettes/core/session/i_validate/returns_false_if_session_is_no_longer_valid.yml +1 -1
  42. data/test/cassettes/core/session/i_validate/returns_true_if_session_is_still_valid.yml +1 -1
  43. data/test/cassettes/core/session/i_xxx_service/returns_an_instance_of_the_indicated_service.yml +1 -1
  44. data/test/cassettes/openstack/compute/v2/public/list_images/leads_to_a_valid_response_when_no_parameters_are_provided.yml +1 -1
  45. data/test/cassettes/openstack/compute/v2/public/list_images/leads_to_a_valid_response_when_parameters_are_invalid.yml +1 -1
  46. data/test/cassettes/openstack/compute/v2/public/list_images/leads_to_a_valid_response_when_parameters_are_valid.yml +1 -1
  47. data/test/cassettes/openstack/compute/v2/public/list_images/returns_the_correct_value_for_body.yml +1 -1
  48. data/test/cassettes/openstack/compute/v2/public/list_images/returns_the_correct_value_for_body_.yml +1 -1
  49. data/test/cassettes/openstack/compute/v2/public/list_images/returns_the_correct_value_for_headers.yml +1 -1
  50. data/test/cassettes/openstack/compute/v2/public/list_images/returns_the_correct_value_for_headers_.yml +1 -1
  51. data/test/cassettes/openstack/compute/v2/public/list_images/returns_the_correct_value_for_http_method_.yml +63 -0
  52. data/test/cassettes/openstack/compute/v2/public/list_images/returns_the_correct_value_for_url.yml +1 -1
  53. data/test/cassettes/openstack/compute/v2/public/list_images/returns_the_correct_value_for_url_.yml +1 -1
  54. data/test/cassettes/openstack/compute/v2/public/list_servers/leads_to_a_valid_response_when_no_parameters_are_provided.yml +101 -0
  55. data/test/cassettes/openstack/compute/v2/public/list_servers/leads_to_a_valid_response_when_parameters_are_invalid.yml +95 -0
  56. data/test/cassettes/openstack/compute/v2/public/list_servers/leads_to_a_valid_response_when_parameters_are_valid.yml +109 -0
  57. data/test/cassettes/openstack/compute/v2/public/list_servers/returns_the_correct_value_for_body_.yml +62 -0
  58. data/test/cassettes/openstack/compute/v2/public/list_servers/returns_the_correct_value_for_headers_.yml +62 -0
  59. data/test/cassettes/openstack/compute/v2/public/list_servers/returns_the_correct_value_for_http_method_.yml +62 -0
  60. data/test/cassettes/openstack/compute/v2/public/list_servers/returns_the_correct_value_for_url_.yml +62 -0
  61. data/test/cassettes/openstack/identity/v2/admin/create_tenant/leads_to_a_valid_response_when_params_are_invalid.yml +1 -1
  62. data/test/cassettes/openstack/identity/v2/admin/create_tenant/leads_to_a_valid_response_when_params_are_valid.yml +1 -1
  63. data/test/cassettes/openstack/identity/v2/admin/create_tenant/leads_to_a_valid_response_when_provided_with_invalid_params.yml +1 -1
  64. data/test/cassettes/openstack/identity/v2/public/create_token/leads_to_a_valid_response_when_parameters_are_valid.yml +1 -1
  65. data/test/cassettes/openstack/identity/v2/public/create_token/leads_to_a_valid_response_when_provided_with_a_token.yml +2 -2
  66. data/test/support/{openstack_request_test_helper.rb → request_helper.rb} +21 -2
  67. data/test/support/test_base_class.rb +1 -1
  68. data/test/support/test_reporter.rb +4 -2
  69. data/test/support/vcr_setup.rb +4 -0
  70. data/test/test_helper.rb +5 -1
  71. metadata +38 -10
@@ -0,0 +1,58 @@
1
+ module Aviator
2
+
3
+ define_request :list_servers do
4
+
5
+ meta :provider, :openstack
6
+ meta :service, :compute
7
+ meta :api_version, :v2
8
+ meta :endpoint_type, :public
9
+
10
+ link 'documentation',
11
+ 'http://docs.openstack.org/api/openstack-compute/2/content/List_Servers-d1e2078.html'
12
+
13
+ param :details, required: false
14
+ param :flavor, required: false
15
+ param :image, required: false
16
+ param :limit, required: false
17
+ param :marker, required: false
18
+ param :server, required: false
19
+ param :status, required: false
20
+ param 'changes-since', required: false
21
+
22
+
23
+ def headers
24
+ h = {}
25
+
26
+ unless self.anonymous?
27
+ h['X-Auth-Token'] = session_data[:access][:token][:id]
28
+ end
29
+
30
+ h
31
+ end
32
+
33
+
34
+ def http_method
35
+ :get
36
+ end
37
+
38
+
39
+ def url
40
+ service_spec = session_data[:access][:serviceCatalog].find{|s| s[:type] == service.to_s }
41
+
42
+ str = "#{ service_spec[:endpoints][0][:publicURL] }/servers"
43
+ str += "/detail" if params[:details]
44
+
45
+ filters = []
46
+
47
+ (optional_params + required_params - [:details]).each do |param_name|
48
+ filters << "#{ param_name }=#{ params[param_name] }" if params[param_name]
49
+ end
50
+
51
+ str += "?#{ filters.join('&') }" unless filters.empty?
52
+
53
+ str
54
+ end
55
+
56
+ end
57
+
58
+ end
@@ -1,42 +1,53 @@
1
- define_request :create_tenant do
1
+ module Aviator
2
2
 
3
- endpoint_type :admin
4
- api_version :v2
5
- http_method :post
3
+ define_request :create_tenant do
6
4
 
7
- link_to 'documentation',
8
- 'http://docs.openstack.org/api/openstack-identity-service/2.0/content/POST_addTenant_v2.0_tenants_.html'
5
+ meta :provider, :openstack
6
+ meta :service, :identity
7
+ meta :api_version, :v2
8
+ meta :endpoint_type, :admin
9
9
 
10
- required_param :name
11
- required_param :description
12
- required_param :enabled
10
+ link 'documentation',
11
+ 'http://docs.openstack.org/api/openstack-identity-service/2.0/content/'
13
12
 
14
13
 
15
- def url
16
- service_spec = session_data[:access][:serviceCatalog].find{|s| s[:type] == 'identity' }
17
- "#{ service_spec[:endpoints][0][:adminURL] }/tenants"
18
- end
14
+ param :name, required: true
15
+ param :description, required: true
16
+ param :enabled, required: true
19
17
 
20
-
21
- def headers
22
- h = {}
23
-
24
- unless self.anonymous?
25
- h['X-Auth-Token'] = session_data[:access][:token][:id]
26
- end
27
18
 
28
- h
29
- end
30
-
31
-
32
- def body
33
- {
34
- tenant: {
35
- name: params[:name],
36
- description: params[:description],
37
- enabled: params[:enabled]
19
+ def body
20
+ {
21
+ tenant: {
22
+ name: params[:name],
23
+ description: params[:description],
24
+ enabled: params[:enabled]
25
+ }
38
26
  }
39
- }
27
+ end
28
+
29
+
30
+ def headers
31
+ h = {}
32
+
33
+ unless self.anonymous?
34
+ h['X-Auth-Token'] = session_data[:access][:token][:id]
35
+ end
36
+
37
+ h
38
+ end
39
+
40
+
41
+ def http_method
42
+ :post
43
+ end
44
+
45
+
46
+ def url
47
+ service_spec = session_data[:access][:serviceCatalog].find{|s| s[:type] == 'identity' }
48
+ "#{ service_spec[:endpoints][0][:adminURL] }/tenants"
49
+ end
50
+
40
51
  end
41
52
 
42
- end
53
+ end
@@ -1,43 +1,54 @@
1
- define_request :list_tenants do
2
-
3
- endpoint_type :admin
4
- api_version :v2
5
- http_method :get
6
-
7
- link_to 'documentation',
8
- 'http://docs.openstack.org/api/openstack-identity-service/2.0/content/GET_listTenants_v2.0_tenants_Tenant_Operations.html'
9
-
10
- link_to 'documentation bug',
11
- 'https://bugs.launchpad.net/keystone/+bug/1218601'
12
-
13
- optional_param :marker
14
- optional_param :limit
15
-
16
-
17
- def url
18
- service_spec = session_data[:access][:serviceCatalog].find{|s| s[:type] == 'identity' }
19
- str = "#{ service_spec[:endpoints][0][:adminURL] }/tenants"
20
-
21
- filters = []
22
-
23
- (optional_params + required_params).each do |param_name|
24
- filters << "#{ param_name }=#{ params[param_name] }" if params[param_name]
1
+ module Aviator
2
+
3
+ define_request :list_tenants do
4
+
5
+ meta :provider, :openstack
6
+ meta :service, :identity
7
+ meta :api_version, :v2
8
+ meta :endpoint_type, :admin
9
+
10
+ link 'documentation',
11
+ 'http://docs.openstack.org/api/openstack-identity-service/2.0/content/GET_listTenants_v2.0_tenants_Tenant_Operations.html'
12
+
13
+ link 'documentation bug',
14
+ 'https://bugs.launchpad.net/keystone/+bug/1218601'
15
+
16
+
17
+ param :marker, required: false
18
+ param :limit, required: false
19
+
20
+
21
+ def headers
22
+ h = {}
23
+
24
+ unless self.anonymous?
25
+ h['X-Auth-Token'] = session_data[:access][:token][:id]
26
+ end
27
+
28
+ h
25
29
  end
26
-
27
- str += "?#{ filters.join('&') }" unless filters.empty?
28
-
29
- str
30
- end
31
30
 
32
-
33
- def headers
34
- h = {}
35
-
36
- unless self.anonymous?
37
- h['X-Auth-Token'] = session_data[:access][:token][:id]
31
+
32
+ def http_method
33
+ :get
34
+ end
35
+
36
+
37
+ def url
38
+ service_spec = session_data[:access][:serviceCatalog].find{|s| s[:type] == 'identity' }
39
+ str = "#{ service_spec[:endpoints][0][:adminURL] }/tenants"
40
+
41
+ filters = []
42
+
43
+ (optional_params + required_params).each do |param_name|
44
+ filters << "#{ param_name }=#{ params[param_name] }" if params[param_name]
45
+ end
46
+
47
+ str += "?#{ filters.join('&') }" unless filters.empty?
48
+
49
+ str
38
50
  end
39
51
 
40
- h
41
52
  end
42
-
43
- end
53
+
54
+ end
@@ -1,61 +1,67 @@
1
- define_request :create_token do
1
+ module Aviator
2
2
 
3
- anonymous
3
+ define_request :create_token do
4
4
 
5
- endpoint_type :public
6
- api_version :v2
7
- http_method :post
5
+ meta :anonymous, true
6
+ meta :provider, :openstack
7
+ meta :service, :identity
8
+ meta :api_version, :v2
9
+ meta :endpoint_type, :public
8
10
 
9
- link_to 'documentation',
10
- 'http://docs.openstack.org/api/openstack-identity-service/2.0/content/POST_authenticate_v2.0_tokens_.html'
11
-
12
- link_to 'documentation bug',
13
- 'https://bugs.launchpad.net/keystone/+bug/1208607'
11
+ link 'documentation',
12
+ 'http://docs.openstack.org/api/openstack-identity-service/2.0/content/POST_authenticate_v2.0_tokens_.html'
14
13
 
14
+ link 'documentation bug',
15
+ 'https://bugs.launchpad.net/keystone/+bug/1208607'
15
16
 
16
- optional_param :username
17
- optional_param :password
18
- optional_param :tokenId
19
-
20
- optional_param :tenantName
21
- optional_param :tenantId
22
17
 
23
-
24
- # TODO: Add logic for when session_data is actually an OpenStack
25
- # authentication response body and not auth bootstrap information
26
- def url
27
- url = session_data[:auth_service][:host_uri]
28
- url += '/v2.0' if (URI(url).path =~ /^\/?\w+/).nil?
29
- url += "/tokens"
30
-
31
- url
32
- end
18
+ param :username, required: false
19
+ param :password, required: false
20
+ param :tokenId, required: false
21
+ param :tenantName, required: false
22
+ param :tenantId, required: false
33
23
 
34
24
 
35
- def body
36
- p = if params[:tokenId]
37
- {
38
- auth: {
39
- token: {
40
- id: params[:tokenId]
25
+ def body
26
+ p = if params[:tokenId]
27
+ {
28
+ auth: {
29
+ token: {
30
+ id: params[:tokenId]
31
+ }
41
32
  }
42
33
  }
43
- }
44
- else
45
- {
46
- auth: {
47
- passwordCredentials: {
48
- username: params[:username],
49
- password: params[:password]
34
+ else
35
+ {
36
+ auth: {
37
+ passwordCredentials: {
38
+ username: params[:username],
39
+ password: params[:password]
40
+ }
50
41
  }
51
42
  }
52
- }
53
- end
54
-
55
- p[:auth][:tenantName] = params[:tenantName] if params[:tenantName]
56
- p[:auth][:tenantId] = params[:tenantId] if params[:tenantId]
57
-
58
- p
43
+ end
44
+
45
+ p[:auth][:tenantName] = params[:tenantName] if params[:tenantName]
46
+ p[:auth][:tenantId] = params[:tenantId] if params[:tenantId]
47
+
48
+ p
49
+ end
50
+
51
+
52
+ def http_method
53
+ :post
54
+ end
55
+
56
+
57
+ def url
58
+ url = session_data[:auth_service][:host_uri]
59
+ url += '/v2.0' if (URI(url).path =~ /^\/?\w+/).nil?
60
+ url += "/tokens"
61
+
62
+ url
63
+ end
64
+
59
65
  end
60
66
 
61
- end
67
+ end
@@ -1,44 +1,54 @@
1
- define_request :list_tenants do
2
-
3
- endpoint_type :public
4
- api_version :v2
5
- http_method :get
1
+ module Aviator
2
+
3
+ define_request :list_tenants do
6
4
 
7
- link_to 'documentation',
8
- 'http://docs.openstack.org/api/openstack-identity-service/2.0/content/GET_listTenants_v2.0_tokens_tenants_.html'
5
+ meta :provider, :openstack
6
+ meta :service, :identity
7
+ meta :api_version, :v2
8
+ meta :endpoint_type, :public
9
+
10
+ link 'documentation',
11
+ 'http://docs.openstack.org/api/openstack-identity-service/2.0/content/GET_listTenants_v2.0_tokens_tenants_.html'
9
12
 
10
- link_to 'documentation bug',
11
- 'https://bugs.launchpad.net/keystone/+bug/1218601'
13
+ link 'documentation bug',
14
+ 'https://bugs.launchpad.net/keystone/+bug/1218601'
12
15
 
13
16
 
14
- optional_param :marker
15
- optional_param :limit
17
+ param :marker, required: false
18
+ param :limit, required: false
16
19
 
17
20
 
18
- def url
19
- service_spec = session_data[:access][:serviceCatalog].find{|s| s[:type] == 'identity' }
20
- str = "#{ service_spec[:endpoints][0][:publicURL] }/tenants"
21
+ def url
22
+ service_spec = session_data[:access][:serviceCatalog].find{|s| s[:type] == 'identity' }
23
+ str = "#{ service_spec[:endpoints][0][:publicURL] }/tenants"
21
24
 
22
- filters = []
25
+ filters = []
23
26
 
24
- (optional_params + required_params).each do |param_name|
25
- filters << "#{ param_name }=#{ params[param_name] }" if params[param_name]
26
- end
27
+ (optional_params + required_params).each do |param_name|
28
+ filters << "#{ param_name }=#{ params[param_name] }" if params[param_name]
29
+ end
27
30
 
28
- str += "?#{ filters.join('&') }" unless filters.empty?
31
+ str += "?#{ filters.join('&') }" unless filters.empty?
29
32
 
30
- str
31
- end
33
+ str
34
+ end
32
35
 
33
36
 
34
- def headers
35
- h = {}
37
+ def headers
38
+ h = {}
36
39
 
37
- unless self.anonymous?
38
- h['X-Auth-Token'] = session_data[:access][:token][:id]
40
+ unless self.anonymous?
41
+ h['X-Auth-Token'] = session_data[:access][:token][:id]
42
+ end
43
+
44
+ h
45
+ end
46
+
47
+
48
+ def http_method
49
+ :get
39
50
  end
40
51
 
41
- h
42
52
  end
43
53
 
44
54
  end
@@ -1,3 +1,3 @@
1
1
  module Aviator
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
data/lib/aviator.rb ADDED
@@ -0,0 +1 @@
1
+ require 'aviator/core'
@@ -0,0 +1,140 @@
1
+ require 'test_helper'
2
+
3
+ class Aviator::Test
4
+
5
+ describe 'aviator/core/cli/describer' do
6
+
7
+ def get_provider_names
8
+ Pathname.new(__FILE__)
9
+ .join('..', '..', '..', '..', '..', 'lib', 'aviator')
10
+ .children
11
+ .select{|c| c.directory? && c.basename.to_s != 'core' }
12
+ .map{|c| c.basename.to_s }
13
+ end
14
+
15
+
16
+ def get_random_entry(array)
17
+ array[rand(array.length)]
18
+ end
19
+
20
+
21
+ def get_request_classes(provider_name, service_name)
22
+ service = Aviator::Service.new(provider: provider_name, service: service_name)
23
+ service.request_classes
24
+ end
25
+
26
+
27
+ def get_service_names(provider_name)
28
+ Pathname.new(__FILE__)
29
+ .join('..', '..', '..', '..', '..', 'lib', 'aviator', provider_name)
30
+ .children
31
+ .select{|c| c.directory? }
32
+ .map{|c| c.basename.to_s }
33
+ end
34
+
35
+
36
+ describe '::describe_aviator' do
37
+
38
+ it 'describes the aviator gem' do
39
+ provider_names = get_provider_names
40
+
41
+ display = "Available providers:\n"
42
+
43
+ provider_names.each do |provider_name|
44
+ display << " #{ provider_name }\n"
45
+ end
46
+
47
+ Aviator::Describer.describe_aviator.must_equal display
48
+ end
49
+
50
+ end # describe '::describe_aviator'
51
+
52
+
53
+ describe '::describe_provider' do
54
+
55
+ it 'describes the given provider' do
56
+ provider_name = get_random_entry(get_provider_names)
57
+ service_names = get_service_names(provider_name)
58
+
59
+ display = "Available services for #{ provider_name }:\n"
60
+
61
+ service_names.each do |service_name|
62
+ display << " #{ service_name }\n"
63
+ end
64
+
65
+ Aviator::Describer.describe_provider('openstack').must_equal display
66
+ end
67
+
68
+ end # describe '::describe_provider'
69
+
70
+
71
+ describe '::describe_service' do
72
+
73
+ it 'describes a given service for a given provider' do
74
+ provider_name = get_random_entry(get_provider_names)
75
+ service_name = get_random_entry(get_service_names(provider_name))
76
+ request_classes = get_request_classes(provider_name, service_name)
77
+
78
+ display = "Available requests for #{ provider_name } #{ service_name }_service:\n"
79
+
80
+ request_classes.each do |klass|
81
+ display << " #{ klass.api_version } #{ klass.endpoint_type } #{ klass.name.split('::').last.underscore }\n"
82
+ end
83
+
84
+ Aviator::Describer.describe_service(provider_name, service_name).must_equal display
85
+ end
86
+
87
+ end # describe '::describe_service'
88
+
89
+
90
+ describe '::describe_request' do
91
+
92
+ it 'describes a given request' do
93
+ provider_name = get_random_entry(get_provider_names)
94
+ service_name = get_random_entry(get_service_names(provider_name))
95
+ request_class = get_random_entry(get_request_classes(provider_name, service_name))
96
+ request_name = request_class.name.split('::').last.underscore
97
+
98
+ display = "Request: #{ request_name }\n\n"
99
+
100
+ display << "Parameters:\n"
101
+
102
+ params = request_class.optional_params.map{|p| [p, :optional]} +
103
+ request_class.required_params.map{|p| [p, :required]}
104
+
105
+ params.sort{|a,b| a[0].to_s <=> b[0].to_s }.each do |param|
106
+ display << " (#{ param[1].to_s }) #{ param[0] }\n"
107
+ end
108
+
109
+ display << "\nSample Code:\n"
110
+
111
+ display << " session.#{ service_name }_service.request(:#{ request_name }, endpoint_type: '#{ request_class.endpoint_type }')"
112
+ if params
113
+ display << " do |params|\n"
114
+ params.each do |pair|
115
+ display << " params['#{ pair[0] }'] = value\n"
116
+ end
117
+ display << " end\n"
118
+ end
119
+
120
+ if request_class.links
121
+ display << "\nLinks:\n"
122
+
123
+ request_class.links.each do |link|
124
+ display << " #{ link[:rel] }:\n"
125
+ display << " #{ link[:href] }\n"
126
+ end
127
+ end
128
+
129
+ Aviator::Describer.describe_request(
130
+ provider_name, service_name, request_class.api_version.to_s,
131
+ request_class.endpoint_type.to_s, request_name
132
+ ).must_equal display
133
+ end
134
+
135
+ end # describe '::describe_request'
136
+
137
+
138
+ end # describe 'aviator/core/cli/describe'
139
+
140
+ end # class Aviator::Test