| 
									
										
										
										
											2018-04-04 22:44:39 +03:00
										 |  |  | module PathScenariosGenerator | 
					
						
							| 
									
										
										
										
											2015-10-06 13:50:26 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-04 22:44:39 +03:00
										 |  |  |   def generate_get_path_scenarios_with_provider name, path, provider, &block | 
					
						
							|  |  |  |     concat %Q(
 | 
					
						
							|  |  |  |   @#{provider} | 
					
						
							| 
									
										
										
										
											2015-10-06 13:50:26 +03:00
										 |  |  |   Scenario: #{name} | 
					
						
							| 
									
										
										
										
											2018-04-04 22:44:39 +03:00
										 |  |  |     When I send GET '#{path}' query | 
					
						
							| 
									
										
										
										
											2015-10-06 13:50:26 +03:00
										 |  |  |     Then response should be '200' | 
					
						
							|  |  |  |     And the Content-Type header should include 'application/json' | 
					
						
							| 
									
										
										
										
											2018-04-04 22:44:39 +03:00
										 |  |  | ) | 
					
						
							|  |  |  |     res = block.call if block_given? | 
					
						
							|  |  |  |     generate_401_406 name, "GET", path, nil, provider | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2015-10-06 13:50:26 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-04 22:44:39 +03:00
										 |  |  |   def generate_get_path_scenarios name, path, &block | 
					
						
							|  |  |  |     concat %Q(
 | 
					
						
							|  |  |  |   Scenario: #{name} | 
					
						
							|  |  |  |     When I send GET '#{path}' query | 
					
						
							|  |  |  |     Then response should be '200' | 
					
						
							|  |  |  |     And the Content-Type header should include 'application/json' | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  |     res = block.call if block_given? | 
					
						
							|  |  |  |     generate_401_406 name, "GET", path | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def generate_mandatory_fields_validation method, name, path, body, mandatory_fields=[], provider=nil | 
					
						
							|  |  |  |     mandatory_fields.each do |field| | 
					
						
							|  |  |  |       types = [Array, Hash, String] | 
					
						
							|  |  |  |       val_class = body[field].class | 
					
						
							|  |  |  |       types.delete(val_class) | 
					
						
							|  |  |  |       # mongoid specification: [] and {} are valid values for String | 
					
						
							|  |  |  |      # invalid_value_code = val_class == String ? 422 : 400 | 
					
						
							|  |  |  |       types.each do |t| | 
					
						
							|  |  |  |         value = t.new | 
					
						
							|  |  |  |         tmp_body = body.clone | 
					
						
							|  |  |  |         tmp_body[field] = value | 
					
						
							|  |  |  |         concat "\n  @#{provider}" if provider | 
					
						
							|  |  |  |         concat %Q(\n  Scenario: #{name} with invalid parameter '#{field}', value: '#{value}'
 | 
					
						
							|  |  |  |     When I send #{method.upcase} '#{path}' query with JSON body | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | #{JSON.pretty_generate(tmp_body)} | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     Then response should be '400' | 
					
						
							|  |  |  |     And the Content-Type header should include 'application/json' | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  |         tmp_body[field] = nil | 
					
						
							|  |  |  |         concat "\n  @#{provider}" if provider | 
					
						
							|  |  |  |         concat %Q(\n  Scenario: #{name} with invalid parameter '#{field}', value: null
 | 
					
						
							|  |  |  |     When I send #{method.upcase} '#{path}' query with JSON body | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | #{JSON.pretty_generate(tmp_body)} | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     Then response should be '400' | 
					
						
							|  |  |  |     And the Content-Type header should include 'application/json' | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  |         tmp_body.delete(field) | 
					
						
							|  |  |  |         concat "\n  @#{provider}" if provider | 
					
						
							|  |  |  |         concat %Q(\n  Scenario: #{name} without parameter '#{field}'
 | 
					
						
							|  |  |  |     When I send #{method.upcase} '#{path}' query with JSON body | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | #{JSON.pretty_generate(tmp_body)} | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     Then response should be '400' | 
					
						
							|  |  |  |     And the Content-Type header should include 'application/json' | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def generate_create_path_scenarios_without_401 name, path, body, mandatory_fields=[], provider=nil, &block | 
					
						
							|  |  |  |     generate_406 name, "POST", path, body, provider | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     generate_mandatory_fields_validation "POST", name, path, body, mandatory_fields, provider | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     concat "\n  @#{provider}" if provider | 
					
						
							|  |  |  |     concat %Q(\n  Scenario: #{name}
 | 
					
						
							|  |  |  |     When I send POST '#{path}' query with JSON body | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | #{JSON.pretty_generate(body)} | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     Then response should be '201' | 
					
						
							|  |  |  |     And the Content-Type header should include 'application/json' | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  |     res = block.call if block_given? | 
					
						
							|  |  |  |     concat "\n  @#{provider}" if provider | 
					
						
							|  |  |  |     concat %Q(\n  Scenario: #{name} (second time)
 | 
					
						
							|  |  |  |     When I send POST '#{path}' query with JSON body | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | #{JSON.pretty_generate(body)} | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     Then response should be '422' | 
					
						
							|  |  |  |     And the Content-Type header should include 'application/json' | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def generate_create_path_scenarios name, path, body, mandatory_fields=[], provider=nil, &block | 
					
						
							|  |  |  |     generate_401 name, "POST", path, provider | 
					
						
							|  |  |  |     generate_create_path_scenarios_without_401 name, path, body, mandatory_fields, provider, &block | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def generate_401_406_415 name, method, path, body, provider=nil | 
					
						
							|  |  |  |     generate_401_406(name, method, path, body, provider) | 
					
						
							|  |  |  |     generate_415 name, method, path, body, provider | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2015-10-06 13:50:26 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-04 22:44:39 +03:00
										 |  |  |   def generate_401_406 name, method, path, body=nil, provider=nil | 
					
						
							|  |  |  |     generate_406 name, method, path, body, provider | 
					
						
							|  |  |  |     generate_401 name, method, path, provider | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def generate_401 name, method, path, provider=nil | 
					
						
							|  |  |  |     concat "\n  @#{provider}" unless provider.nil? | 
					
						
							|  |  |  |     concat %Q(\n  Scenario: #{name} with user without privileges
 | 
					
						
							|  |  |  |     When I send #{method} '#{path}' query with user without privileges | 
					
						
							| 
									
										
										
										
											2015-10-06 13:50:26 +03:00
										 |  |  |     Then response should be '401' | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-04 22:44:39 +03:00
										 |  |  |   def generate_406 name, method, path, body=nil, provider=nil | 
					
						
							|  |  |  |     concat "\n  @#{provider}" unless provider.nil? | 
					
						
							|  |  |  |     if body.nil? | 
					
						
							|  |  |  |     concat %Q(\n  Scenario: #{name} with header 'Accept' value not 'application/json'
 | 
					
						
							|  |  |  |     When I send #{method} '#{path}' query with header 'Accept' value 'application/xml' | 
					
						
							|  |  |  |     Then response should be '406' | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |     concat %Q(\n  Scenario: #{name} with header 'Accept' value not 'application/json'
 | 
					
						
							|  |  |  |     When I send #{method} '#{path}' query with JSON body with header 'Accept' value 'application/xml' | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | #{JSON.pretty_generate(body)} | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     Then response should be '406' | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def generate_415 name, method, path, body, provider=nil | 
					
						
							|  |  |  |     concat "\n  @#{provider}" unless provider.nil? | 
					
						
							|  |  |  |     concat %Q(\n  Scenario: #{name} without header 'Content-Type'
 | 
					
						
							|  |  |  |     When I send #{method} '#{path}' query with JSON body without header 'Content-Type' | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | #{JSON.pretty_generate(body)} | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     Then response should be '415' | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def generate_delete_path_scenarios name, path, provider=nil, &block | 
					
						
							|  |  |  |     generate_401 name, "DELETE", path, provider | 
					
						
							|  |  |  |     generate_406 name, "DELETE", path, nil, provider | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     concat "\n  @#{provider}" if provider | 
					
						
							|  |  |  |     concat %Q(\n  Scenario: #{name}
 | 
					
						
							|  |  |  |     When I send DELETE '#{path}' query | 
					
						
							|  |  |  |     Then response should be '200' | 
					
						
							|  |  |  |     And the Content-Type header should include 'application/json' | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  |     res = block.call if block_given? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     concat "\n  @#{provider}" unless provider.nil? | 
					
						
							|  |  |  |     concat %Q(\n   Scenario: #{name} (second time)
 | 
					
						
							|  |  |  |     When I send DELETE '#{path}' query | 
					
						
							|  |  |  |     Then response should be '404' | 
					
						
							|  |  |  |     And the Content-Type header should include 'application/json' | 
					
						
							|  |  |  |     And the JSON response should be an object | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def generate_update_path_scenarios name, path, body, provider=nil, &block | 
					
						
							|  |  |  |     generate_modify_path_scenarios "PUT", name, path, body, provider, &block | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def generate_modify_path_scenarios method, name, path, body, provider=nil, &block | 
					
						
							|  |  |  |     generate_401 name, method.upcase, path, provider | 
					
						
							|  |  |  |     generate_406 name, method.upcase, path, body, provider | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     concat "\n  @#{provider}" if provider | 
					
						
							|  |  |  |     concat %Q(\n  Scenario: #{name}
 | 
					
						
							|  |  |  |     When I send #{method.upcase} '#{path}' query with JSON body | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | #{JSON.pretty_generate(body)} | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     Then response should be '200' | 
					
						
							|  |  |  |     And the Content-Type header should include 'application/json' | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  |     res = block.call if block_given? | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-06 13:50:26 +03:00
										 |  |  | end |