From 356925de4975ad737dd0523e23b979a3579b1ad2 Mon Sep 17 00:00:00 2001 From: Anton Chuchkalov Date: Wed, 8 Jul 2015 17:48:19 +0400 Subject: [PATCH] add more tests --- devops-service/tests/generate_tests.rb | 17 ++++- .../api_v2/10_create/00_key.feature.erb | 34 ++++++++++ .../10_create/00_stack_template.feature.erb | 25 +++++++ .../api_v2/10_create/50_stack.feature.erb | 27 ++++++++ .../90_delete/00_stack_template.feature.erb | 19 ++++++ .../api_v2/90_delete/10_stack.feature.erb | 19 ++++++ .../api_v2/90_delete/99_key.feature.erb | 10 +++ .../templates/fixtures/fixture_formatter.rb | 6 +- .../tests/templates/fixtures/key.yml | 20 ++++++ .../tests/templates/fixtures/stack.yml | 11 ++++ .../templates/fixtures/stack_template.yml | 66 +++++++++++++++++++ 11 files changed, 250 insertions(+), 4 deletions(-) create mode 100644 devops-service/tests/templates/api_v2/10_create/00_key.feature.erb create mode 100644 devops-service/tests/templates/api_v2/10_create/00_stack_template.feature.erb create mode 100644 devops-service/tests/templates/api_v2/10_create/50_stack.feature.erb create mode 100644 devops-service/tests/templates/api_v2/90_delete/00_stack_template.feature.erb create mode 100644 devops-service/tests/templates/api_v2/90_delete/10_stack.feature.erb create mode 100644 devops-service/tests/templates/api_v2/90_delete/99_key.feature.erb create mode 100644 devops-service/tests/templates/fixtures/key.yml create mode 100644 devops-service/tests/templates/fixtures/stack.yml create mode 100644 devops-service/tests/templates/fixtures/stack_template.yml diff --git a/devops-service/tests/generate_tests.rb b/devops-service/tests/generate_tests.rb index 91cb57a..ded4523 100755 --- a/devops-service/tests/generate_tests.rb +++ b/devops-service/tests/generate_tests.rb @@ -12,7 +12,8 @@ class Generator < OpenStruct TESTS_CONFIG = "features/support/config.yml" def initialize - @config = YAML.load_file(File.new(ENV["CONFIG"] || CONFIG)) + config_file = ENV["DEVOPS_FEATURES_GENERATOR_CONFIG"] || ENV["CONFIG"] || CONFIG + @config = YAML.load_file(File.new(config_file)) load_fixtures() super(:config => @config) end @@ -63,7 +64,11 @@ class Generator < OpenStruct def load_fixtures @fixtures = {} - @fixtures['deploy_env'] = YAML.load_file('templates/fixtures/deploy_env.yml') + Dir["templates/fixtures/*.yml"].each do |fixture_path| + fixture_name = File.basename(fixture_path, '.yml') + @fixtures[fixture_name] = YAML.load_file(fixture_path) + end + @formatter = FixtureFormatter.new(@fixtures) end end @@ -77,7 +82,10 @@ templates = { #create "templates/api_v2/10_create/00_filter.feature.erb" => "features/api_v2/10_create/00_filter.feature", + "templates/api_v2/10_create/00_stack_template.feature.erb" => "features/api_v2/10_create/00_stack_template.feature", + "templates/api_v2/10_create/00_key.feature.erb" => "features/api_v2/10_create/00_key.feature", "templates/api_v2/10_create/10_image.feature.erb" => "features/api_v2/10_create/10_image.feature", + "templates/api_v2/10_create/50_stack.feature.erb" => "features/api_v2/10_create/50_stack.feature", "templates/api_v2/10_create/20_project.feature.erb" => "features/api_v2/10_create/20_project.feature", "templates/api_v2/10_create/30_script.feature.erb" => "features/api_v2/10_create/30_script.feature", "templates/api_v2/10_create/40_deploy_env.feature.erb" => "features/api_v2/10_create/40_deploy_env.feature", @@ -88,12 +96,15 @@ templates = { "templates/api_v2/20_update/00_user.feature.erb" => "features/api_v2/20_update/00_user.feature", #delete + "templates/api_v2/90_delete/00_stack_template.feature.erb" => "features/api_v2/90_delete/00_stack_template.feature", "templates/api_v2/90_delete/10_script.feature.erb" => "features/api_v2/90_delete/10_script.feature", + "templates/api_v2/90_delete/10_stack.feature.erb" => "features/api_v2/90_delete/10_stack.feature", "templates/api_v2/90_delete/20_deploy_env.feature.erb" => "features/api_v2/90_delete/20_deploy_env.feature", "templates/api_v2/90_delete/80_project.feature.erb" => "features/api_v2/90_delete/80_project.feature", "templates/api_v2/90_delete/90_image.feature.erb" => "features/api_v2/90_delete/90_image.feature", + "templates/api_v2/90_delete/90_user.feature.erb" => "features/api_v2/90_delete/90_user.feature", "templates/api_v2/90_delete/99_filter.feature.erb" => "features/api_v2/90_delete/99_filter.feature", - "templates/api_v2/90_delete/90_user.feature.erb" => "features/api_v2/90_delete/90_user.feature" + "templates/api_v2/90_delete/99_key.feature.erb" => "features/api_v2/90_delete/99_key.feature" } diff --git a/devops-service/tests/templates/api_v2/10_create/00_key.feature.erb b/devops-service/tests/templates/api_v2/10_create/00_key.feature.erb new file mode 100644 index 0000000..e322187 --- /dev/null +++ b/devops-service/tests/templates/api_v2/10_create/00_key.feature.erb @@ -0,0 +1,34 @@ +@key +Feature: Add new script + + Scenario: Add new key without file_name + When I send POST '/v2.0/key' query with JSON body + """ + <%= @formatter.json('key/invalid/blank_file_name', spaces: 6) %> + """ + Then response should be '400' + And response error should be "Parameter 'file_name' must be a not empty string" + + Scenario: Add new key without key_name + When I send POST '/v2.0/key' query with JSON body + """ + <%= @formatter.json('key/invalid/blank_key_name', spaces: 6) %> + """ + Then response should be '400' + And response error should be "Parameter 'key_name' should be a not empty string" + + Scenario: Add new key without content + When I send POST '/v2.0/key' query with JSON body + """ + <%= @formatter.json('key/invalid/blank_content', spaces: 6) %> + """ + Then response should be '400' + And response error should be "Parameter 'content' should be a not empty string" + + Scenario: Add new key + When I send POST '/v2.0/key' query with JSON body + """ + <%= @formatter.json('key/valid', spaces: 6) %> + """ + Then response should be '201' + diff --git a/devops-service/tests/templates/api_v2/10_create/00_stack_template.feature.erb b/devops-service/tests/templates/api_v2/10_create/00_stack_template.feature.erb new file mode 100644 index 0000000..cd91172 --- /dev/null +++ b/devops-service/tests/templates/api_v2/10_create/00_stack_template.feature.erb @@ -0,0 +1,25 @@ +@stack_template @project @stack +Feature: Stack templates + + Scenario: Add new stack_template with user without privileges + When I send POST '/v2.0/stack_template' query with JSON body with user without privileges + """ + <%= @formatter.json('stack_template/openstack/valid', spaces: 6) %> + """ + Then response should be '401' + + <% openstack_template_id = @fixtures['stack_template']['openstack']['valid']['id'] %> + @openstack + Scenario: Add openstack stack_template + When I send POST '/v2.0/stack_template' query with JSON body + """ + <%= @formatter.json('stack_template/openstack/valid', spaces: 6) %> + """ + Then response should be '201' + And the Content-Type header should include 'application/json' + And response should be JSON object like: + """ + { + "id": "<%= openstack_template_id %>" + } + """ diff --git a/devops-service/tests/templates/api_v2/10_create/50_stack.feature.erb b/devops-service/tests/templates/api_v2/10_create/50_stack.feature.erb new file mode 100644 index 0000000..fd6af1d --- /dev/null +++ b/devops-service/tests/templates/api_v2/10_create/50_stack.feature.erb @@ -0,0 +1,27 @@ +@stack @project +Feature: Stacks + + Scenario: Add new stack with user without privileges + When I send POST '/v2.0/stack' query with JSON body with user without privileges + """ + <%= @formatter.json('stack/openstack/valid', spaces: 6) %> + """ + Then response should be '401' + + @openstack + Scenario: Add openstack stack + When I send POST '/v2.0/stack' query with JSON body + """ + <%= @formatter.json('stack/openstack/valid', spaces: 4) %> + """ + Then response should be '201' + And the Content-Type header should include 'application/json' + And response should be JSON object like: + """ + { + "id": "test_stack", + "deploy_env": "<%= @config["openstack"]["project"]["env"] %>", + "stack_template": "<%= @config["openstack"]["stack_template"] %>", + "cloud_stack_id": "arn:aws:cloudformation:us-east-1:123456789:stack/MyStack/aaf549a0-a413-11df-adb3-5081b3858e83" + } + """ diff --git a/devops-service/tests/templates/api_v2/90_delete/00_stack_template.feature.erb b/devops-service/tests/templates/api_v2/90_delete/00_stack_template.feature.erb new file mode 100644 index 0000000..21ca38f --- /dev/null +++ b/devops-service/tests/templates/api_v2/90_delete/00_stack_template.feature.erb @@ -0,0 +1,19 @@ +@stack_template @project @stack +Feature: Delete stack template + + <% openstack_template_id = @fixtures['stack_template']['openstack']['valid']['id'] %> + Scenario: Delete stack template with user without privileges + When I send DELETE '/v2.0/stack_template/<%= openstack_template_id %>' query with user without privileges + Then response should be '401' + + @openstack + Scenario: Delete openstack stack_template without header 'Accept' + When I send DELETE '/v2.0/stack_template/<%= openstack_template_id %>' query without header 'Accept' + Then response should be '406' + + @openstack + Scenario: Delete openstack stack_template with id '<%= openstack_template_id %>' + When I send DELETE '/v2.0/stack_template/<%= openstack_template_id %>' query + Then response should be '200' + And the Content-Type header should include 'application/json' + And the JSON response should be an object diff --git a/devops-service/tests/templates/api_v2/90_delete/10_stack.feature.erb b/devops-service/tests/templates/api_v2/90_delete/10_stack.feature.erb new file mode 100644 index 0000000..4412068 --- /dev/null +++ b/devops-service/tests/templates/api_v2/90_delete/10_stack.feature.erb @@ -0,0 +1,19 @@ +@stack @project +Feature: Delete stack + + <% openstack_stack_id = @fixtures['stack']['openstack']['valid']['id'] %> + Scenario: Delete stack with user without privileges + When I send DELETE '/v2.0/stack/<%= openstack_stack_id %>' query with user without privileges + Then response should be '401' + + @openstack + Scenario: Delete openstack stack without header 'Accept' + When I send DELETE '/v2.0/stack/<%= openstack_stack_id %>' query without header 'Accept' + Then response should be '406' + + @openstack + Scenario: Delete stack with id '<%= openstack_stack_id %>' + When I send DELETE '/v2.0/stack/<%= openstack_stack_id %>' query + Then response should be '200' + And the Content-Type header should include 'application/json' + And the JSON response should be an object diff --git a/devops-service/tests/templates/api_v2/90_delete/99_key.feature.erb b/devops-service/tests/templates/api_v2/90_delete/99_key.feature.erb new file mode 100644 index 0000000..08359b7 --- /dev/null +++ b/devops-service/tests/templates/api_v2/90_delete/99_key.feature.erb @@ -0,0 +1,10 @@ +@key +Feature: Delete key + + <% key_name = @fixtures['key']['valid']['key_name'] %> + Scenario: Delete key + When I send DELETE '/v2.0/key/<%= key_name %>' query + Then response should be '200' + And the Content-Type header should include 'application/json' + And the JSON response should be an object + diff --git a/devops-service/tests/templates/fixtures/fixture_formatter.rb b/devops-service/tests/templates/fixtures/fixture_formatter.rb index 0fa3834..4bbe657 100644 --- a/devops-service/tests/templates/fixtures/fixture_formatter.rb +++ b/devops-service/tests/templates/fixtures/fixture_formatter.rb @@ -7,7 +7,11 @@ class FixtureFormatter end def json(path, options={}) - result = JSON.pretty_generate(get_fixture(path)) + begin + result = JSON.pretty_generate(get_fixture(path)) + rescue + raise "Fixture '#{path}' is absent" + end if options[:spaces] result = shift_to_right(result, options[:spaces]) end diff --git a/devops-service/tests/templates/fixtures/key.yml b/devops-service/tests/templates/fixtures/key.yml new file mode 100644 index 0000000..0ad3179 --- /dev/null +++ b/devops-service/tests/templates/fixtures/key.yml @@ -0,0 +1,20 @@ +valid: &valid + file_name: test_file_name + key_name: test_key_name + content: test_content + +invalid: + base: &invalid_base + <<: *valid + blank_file_name: + <<: *invalid_base + file_name: + blank_key_name: + <<: *invalid_base + key_name: + blank_content: + <<: *invalid_base + content: + scope: + <<: *invalid_base + scope: inalid_scope \ No newline at end of file diff --git a/devops-service/tests/templates/fixtures/stack.yml b/devops-service/tests/templates/fixtures/stack.yml new file mode 100644 index 0000000..62afaeb --- /dev/null +++ b/devops-service/tests/templates/fixtures/stack.yml @@ -0,0 +1,11 @@ +openstack: + valid: &valid + id: openstack_stack + provider: openstack + project: test_openstack + deploy_env: test + stack_template: openstack_template + parameters: + admin_pass: Pass12 + key_name: devops + image: CirrOS_0.3.1 \ No newline at end of file diff --git a/devops-service/tests/templates/fixtures/stack_template.yml b/devops-service/tests/templates/fixtures/stack_template.yml new file mode 100644 index 0000000..cd33bda --- /dev/null +++ b/devops-service/tests/templates/fixtures/stack_template.yml @@ -0,0 +1,66 @@ +openstack: + valid: &valid + id: openstack_template + provider: openstack + template_body: | + heat_template_version: 2013-05-23 + + description: > + Hello world HOT template that just defines a single server. + Contains just base features to verify base HOT support. + parameters: + key_name: + type: string + description: Name of an existing key pair to use for the server + constraints: + - custom_constraint: nova.keypair + flavor: + type: string + description: Flavor for the server to be created + default: m1.small + constraints: + - custom_constraint: nova.flavor + image: + type: string + description: Image ID or image name to use for the server + constraints: + - custom_constraint: glance.image + admin_pass: + type: string + description: Admin password + hidden: true + constraints: + - length: { min: 6, max: 8 } + description: Password length must be between 6 and 8 characters + - allowed_pattern: "[a-zA-Z0-9]+" + description: Password must consist of characters and numbers only + - allowed_pattern: "[A-Z]+[a-zA-Z0-9]*" + description: Password must start with an uppercase character + db_port: + type: number + description: Database port number + default: 50000 + constraints: + - range: { min: 40000, max: 60000 } + description: Port number must be between 40000 and 60000 + + resources: + server: + type: OS::Nova::Server + properties: + key_name: { get_param: key_name } + image: { get_param: image } + flavor: { get_param: flavor } + admin_pass: { get_param: admin_pass } + user_data: + str_replace: + template: | + #!/bin/bash + echo db_port + params: + db_port: { get_param: db_port } + + outputs: + server_networks: + description: The networks of the deployed server + value: { get_attr: [server, networks] }