Skip to content
This repository has been archived by the owner on May 23, 2024. It is now read-only.

Commit

Permalink
Merge pull request #91 from bdunne/mock_api_for_testing
Browse files Browse the repository at this point in the history
Add MockApi for testing
  • Loading branch information
bdunne committed Apr 26, 2017
2 parents e33587b + 23526cf commit 9515317
Show file tree
Hide file tree
Showing 27 changed files with 1,282 additions and 153 deletions.
10 changes: 3 additions & 7 deletions spec/ad_hoc_command_spec.rb
Original file line number Diff line number Diff line change
@@ -1,15 +1,11 @@
describe AnsibleTowerClient::AdHocCommand do
let(:url) { "example.com/api/v1/ad_hoc_command_update/10" }
let(:api) { AnsibleTowerClient::Api.new(instance_double("Faraday::Connection")) }
let(:collection) { api.ad_hoc_commands }
let(:raw_collection) { build(:response_collection, :klass => described_class) }
let(:raw_url_collection) { build(:response_url_collection, :klass => described_class, :url => url) }
let(:raw_instance) { build(:response_instance, :klass => described_class) }
let(:api) { AnsibleTowerClient::Api.new(AnsibleTowerClient::MockApi.new) }
let(:raw_instance) { build(:response_instance, :klass => described_class) }

include_examples "Crud Methods"

it "#initialize instantiates an #{described_class} from a hash" do
obj = described_class.new(instance_double("AnsibleTowerClient::Api"), raw_instance)
obj = api.ad_hoc_commands.all.first

expect(obj).to be_a described_class
expect(obj.id).to be_a Integer
Expand Down
32 changes: 4 additions & 28 deletions spec/api_spec.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
require 'faraday'

describe AnsibleTowerClient::Api do
let(:faraday_connection) { instance_double("Faraday::Connection") }
let(:faraday_connection) { AnsibleTowerClient::MockApi.new }

subject { described_class.new(faraday_connection) }

Expand All @@ -14,46 +12,24 @@
end

context "helper methods" do
let(:config_body) do
{:eula => 'text',
:license_info => {:deployment_id => 'werwer', :contact_name => 'Fred Tester'},
:version => '2.4.2', :ansible_version => '1.9.4',
:project_local_paths => []}.to_json
end

let(:credentials_body) do
{:count => 1, :next => nil, :previous => nil,
:results => [{:id => 1, :type => 'user',
:url => '/api/v1/users/1',
:username => 'admin'}]}.to_json
end

let(:faraday_connection) { instance_double("Faraday::Connection", :get => get) }

let(:api) { described_class.new(faraday_connection) }

context "requiring a connection" do
before { allow(Faraday).to receive(:new).and_return(faraday_connection) }

describe "config" do
let(:get) { instance_double("Faraday::Result", :body => config_body) }

it "#config returns the server config" do
json = api.config
json = subject.config
expect(json['eula']).to eq "text"
expect(json['license_info']).to be_a Hash
end

it "#version returns the ansible tower version" do
expect(api.version).to eq "2.4.2"
expect(subject.version).to eq "3.0.1"
end
end

describe "#verify_credentials" do
let(:get) { instance_double("Faraday::Result", :body => credentials_body) }

it "returns the username" do
expect(api.verify_credentials).to eq "admin"
expect(subject.verify_credentials).to eq "admin"
end
end
end
Expand Down
12 changes: 4 additions & 8 deletions spec/credential_spec.rb
Original file line number Diff line number Diff line change
@@ -1,20 +1,16 @@
describe AnsibleTowerClient::Credential do
let(:url) { "example.com/api/v1/credentials/10" }
let(:api) { AnsibleTowerClient::Api.new(instance_double("Faraday::Connection")) }
let(:collection) { api.credentials }
let(:raw_collection) { build(:response_collection, :klass => described_class) }
let(:raw_url_collection) { build(:response_url_collection, :klass => described_class, :url => url) }
let(:raw_instance) { build(:response_instance, :credential, :klass => described_class, :kind => "scm") }
let(:api) { AnsibleTowerClient::Api.new(AnsibleTowerClient::MockApi.new) }
let(:raw_instance) { build(:response_instance, :credential, :klass => described_class) }

include_examples "Crud Methods"

it "#initialize instantiates an #{described_class} from a hash" do
obj = described_class.new(instance_double("AnsibleTowerClient::Api"), raw_instance)
obj = api.credentials.all.first

expect(obj).to be_a described_class
expect(obj.id).to be_a Integer
expect(obj.url).to be_a String
expect(obj.kind).to eq "scm"
expect(obj.kind).to eq "aws"
expect(obj.username).to be_a String
expect(obj.name).to be_a String
end
Expand Down
13 changes: 5 additions & 8 deletions spec/group_spec.rb
Original file line number Diff line number Diff line change
@@ -1,16 +1,13 @@
describe AnsibleTowerClient::Group do
let(:url) { "example.com/api/v1/groups" }
let(:api) { AnsibleTowerClient::Api.new(instance_double("Faraday::Connection")) }
let(:collection) { api.groups }
let(:raw_collection) { build(:response_collection, :klass => described_class) }
let(:raw_url_collection) { build(:response_url_collection, :klass => described_class, :url => url) }
let(:raw_instance) { build(:response_instance, :group, :klass => described_class) }
let(:url) { "example.com/api/v1/groups" }
let(:api) { AnsibleTowerClient::Api.new(AnsibleTowerClient::MockApi.new) }
let(:raw_instance) { build(:response_instance, :group, :klass => described_class) }

include_examples "Crud Methods"
include_examples "Api Methods"
include_examples "Crud Methods"

it "#initialize instantiates an #{described_class} from a hash" do
obj = described_class.new(instance_double("AnsibleTowerClient::Api"), raw_instance)
obj = api.groups.all.first

expect(obj).to be_a described_class
expect(obj.id).to be_a Integer
Expand Down
13 changes: 5 additions & 8 deletions spec/host_spec.rb
Original file line number Diff line number Diff line change
@@ -1,16 +1,13 @@
describe AnsibleTowerClient::Host do
let(:url) { "example.com/api/v1/hosts" }
let(:api) { AnsibleTowerClient::Api.new(instance_double("Faraday::Connection")) }
let(:collection) { api.hosts }
let(:raw_collection) { build(:response_collection, :klass => described_class) }
let(:raw_url_collection) { build(:response_url_collection, :klass => described_class, :url => url) }
let(:raw_instance) { build(:response_instance, :host, :klass => described_class) }
let(:url) { "example.com/api/v1/hosts" }
let(:api) { AnsibleTowerClient::Api.new(AnsibleTowerClient::MockApi.new) }
let(:raw_instance) { build(:response_instance, :host, :klass => described_class) }

include_examples "Crud Methods"
include_examples "Api Methods"
include_examples "Crud Methods"

it "#initialize instantiates an #{described_class} from a hash" do
obj = described_class.new(instance_double("AnsibleTowerClient::Api"), raw_instance)
obj = api.hosts.all.first

expect(obj).to be_a described_class
expect(obj.id).to be_a Integer
Expand Down
11 changes: 4 additions & 7 deletions spec/inventory_source_spec.rb
Original file line number Diff line number Diff line change
@@ -1,15 +1,12 @@
describe AnsibleTowerClient::InventorySource do
let(:url) { "example.com/api/v1/inventory_sources" }
let(:api) { AnsibleTowerClient::Api.new(instance_double("Faraday::Connection")) }
let(:collection) { api.inventory_sources }
let(:raw_collection) { build(:response_collection, :klass => described_class) }
let(:raw_url_collection) { build(:response_url_collection, :klass => described_class, :url => url) }
let(:raw_instance) { build(:response_instance, :klass => described_class) }
let(:url) { "example.com/api/v1/inventory_sources" }
let(:api) { AnsibleTowerClient::Api.new(AnsibleTowerClient::MockApi.new) }
let(:raw_instance) { build(:response_instance, :klass => described_class) }

include_examples "Api Methods"

it "#initialize instantiates an #{described_class} from a hash" do
obj = described_class.new(instance_double("AnsibleTowerClient::Api"), raw_instance)
obj = api.inventory_sources.all.first

expect(obj).to be_a described_class
expect(obj.id).to be_a Integer
Expand Down
31 changes: 13 additions & 18 deletions spec/inventory_spec.rb
Original file line number Diff line number Diff line change
@@ -1,21 +1,17 @@
describe AnsibleTowerClient::Inventory do
let(:url) { "example.com/api/v1/inventories" }
let(:api) { AnsibleTowerClient::Api.new(instance_double("Faraday::Connection")) }
let(:collection) { api.inventories }
let(:raw_collection) { build(:response_collection, :klass => described_class) }
let(:raw_url_collection) { build(:response_url_collection, :klass => described_class, :url => url) }
let(:inventory_source) { build(:response_url_collection, :klass => AnsibleTowerClient::InventorySource) }
let(:raw_instance) { build(:response_instance, :klass => described_class) }
let(:url) { "example.com/api/v1/inventories" }
let(:api) { AnsibleTowerClient::Api.new(AnsibleTowerClient::MockApi.new) }
let(:inventory_source) { build(:response_url_collection, :klass => AnsibleTowerClient::InventorySource) }
let(:raw_instance) { build(:response_instance, :klass => described_class) }
let(:instance) { api.inventories.all.first }

include_examples "Crud Methods"
include_examples "Api Methods"
include_examples "Crud Methods"

it "#initialize instantiates an #{described_class} from a hash" do
obj = described_class.new(instance_double("AnsibleTowerClient::Api"), raw_instance)

expect(obj).to be_a described_class
expect(obj.id).to be_a Integer
expect(obj.name).to be_a String
expect(instance).to be_a described_class
expect(instance.id).to be_a Integer
expect(instance.name).to be_a String
end

describe "#inventory_sources" do
Expand All @@ -34,23 +30,22 @@
let(:inventory_sources) do
[described_class.new(instance_double("AnsibleTowerClient::Api"), inventory_source)]
end
let(:obj) { described_class.new(instance_double("AnsibleTowerClient::Api"), raw_instance) }

before do
expect(obj).to receive(:inventory_sources).and_return(inventory_sources)
expect(instance).to receive(:inventory_sources).and_return(inventory_sources)
end

it "updates an inventory_source if #can_update? is true" do
expect(inventory_sources.first).to receive(:can_update?).and_return(can_update_true['can_update'])
expect(inventory_sources.first).to receive(:update).once.and_return(post_result_body)

obj.update_all_inventory_sources
instance.update_all_inventory_sources
end

it "does not update an inventory_source if #can_update? is true" do
it "does not update an inventory_source if #can_update? is false" do
expect(inventory_sources.first).to receive(:can_update?).and_return(can_update_false['can_update'])

obj.update_all_inventory_sources
instance.update_all_inventory_sources
end
end
end
7 changes: 2 additions & 5 deletions spec/job_event_spec.rb
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
describe AnsibleTowerClient::JobEvent do
let(:url) { "example.com/api/v1/job_events" }
let(:api) { AnsibleTowerClient::Api.new(instance_double("Faraday::Connection")) }
let(:collection) { api.job_events }
let(:raw_url_collection) { build(:response_url_collection, :klass => described_class, :url => url) }
let(:raw_instance) { build(:response_instance, :job_event, :klass => described_class) }
let(:url) { "example.com/api/v1/job_events" }
let(:api) { AnsibleTowerClient::Api.new(AnsibleTowerClient::MockApi.new) }

include_examples "Api Methods"
end
17 changes: 7 additions & 10 deletions spec/job_spec.rb
Original file line number Diff line number Diff line change
@@ -1,18 +1,15 @@
describe AnsibleTowerClient::Job do
let(:url) { "example.com/api/v1/jobs" }
let(:api) { AnsibleTowerClient::Api.new(instance_double("Faraday::Connection")) }
let(:collection) { api.jobs }
let(:raw_collection) { build(:response_collection, :klass => described_class) }
let(:raw_url_collection) { build(:response_url_collection, :klass => described_class, :url => url) }
let(:raw_instance) { build(:response_instance, :job, :klass => described_class) }
let(:url) { "example.com/api/v1/jobs" }
let(:api) { AnsibleTowerClient::Api.new(AnsibleTowerClient::MockApi.new) }
let(:raw_instance) { build(:response_instance, :job, :klass => described_class) }
let(:raw_instance_no_extra_vars) { build(:response_instance, :job_template, :klass => described_class, :extra_vars => '') }
let(:raw_instance_no_output) { build(:response_instance, :job_template, :klass => described_class, :related => {}) }

include_examples "Crud Methods"
include_examples "Api Methods"
include_examples "Crud Methods"

it "#initialize instantiates an #{described_class} from a hash" do
obj = described_class.new(instance_double("AnsibleTowerClient::Api"), raw_instance)
obj = api.jobs.all.first

expect(obj).to be_a described_class
expect(obj.id).to be_a Integer
Expand All @@ -23,14 +20,14 @@
describe "#extra_vars_hash" do
describe "#extra_vars exists" do
it "returns a hashed value" do
obj = described_class.new(instance_double("AnsibleTowerClient::Api"), raw_instance)
obj = described_class.new(AnsibleTowerClient::MockApi.new, raw_instance)
expect(obj.extra_vars_hash).to eq('option' => 'lots of options')
end
end

describe "#extra_vars does not exist" do
it "returns an empty hash" do
obj = described_class.new(instance_double("AnsibleTowerClient::Api"), raw_instance_no_extra_vars)
obj = described_class.new(AnsibleTowerClient::MockApi.new, raw_instance_no_extra_vars)
expect(obj.extra_vars_hash).to eq({})
end
end
Expand Down
19 changes: 6 additions & 13 deletions spec/job_template_spec.rb
Original file line number Diff line number Diff line change
@@ -1,23 +1,16 @@
require 'faraday' # Only because we're doubling the connection

describe AnsibleTowerClient::JobTemplate do
let(:url) { "example.com/api/v1/job_templates" }
let(:api) { AnsibleTowerClient::Api.new(connection).tap { |a| allow(a).to receive(:config).and_return(config) } }
let(:collection) { api.job_templates }
let(:connection) { instance_double("Faraday::Connection") }
let(:config) { {"version" => "1.1"} }
let(:raw_collection) { build(:response_collection, :klass => described_class) }
let(:raw_url_collection) { build(:response_url_collection, :klass => described_class, :url => url) }
let(:raw_instance) { build(:response_instance, :job_template, :klass => described_class) }
let(:url) { "example.com/api/v1/job_templates" }
let(:api) { AnsibleTowerClient::Api.new(AnsibleTowerClient::MockApi.new("1.1")) }
let(:raw_instance) { build(:response_instance, :job_template, :klass => described_class) }
let(:raw_instance_no_extra_vars) { build(:response_instance, :job_template, :klass => described_class, :extra_vars => '') }
let(:raw_instance_no_survey) { build(:response_instance, :job_template, :klass => described_class, :related => {}) }

include_examples "Crud Methods"
include_examples "Api Methods"
include_examples "Crud Methods"
include_examples "JobTemplate#extra_vars_hash"
include_examples "JobTemplate#initialize"
include_examples "JobTemplate#survey_spec"
include_examples "JobTemplate#survey_spec_hash"
include_examples "JobTemplate#extra_vars_hash"

describe '#launch' do
let(:json) { {'extra_vars' => "{\"instance_ids\":[\"i-999c\"],\"state\":\"absent\",\"subnet_id\":\"subnet-887\"}"} }
Expand All @@ -35,7 +28,7 @@
end

context 'override_raw_attributes' do
let(:obj) { described_class.new(instance_double("Faraday::Connection"), raw_instance) }
let(:obj) { described_class.new(AnsibleTowerClient::MockApi.new, raw_instance) }
let(:instance_api) { obj.instance_variable_get(:@api) }

it 'translates :project to :project_id for update_attributes' do
Expand Down
18 changes: 6 additions & 12 deletions spec/job_template_v2_spec.rb
Original file line number Diff line number Diff line change
@@ -1,23 +1,17 @@
require 'faraday' # Only because we're doubling the connection

describe AnsibleTowerClient::JobTemplateV2 do
let(:url) { "example.com/api/v1/job_templates" }
let(:api) { AnsibleTowerClient::Api.new(connection).tap { |a| allow(a).to receive(:config).and_return(config) } }
let(:collection) { api.job_templates }
let(:connection) { instance_double("Faraday::Connection") }
let(:config) { {"version" => "2.1"} }
let(:raw_collection) { build(:response_collection, :klass => described_class.base_class) }
let(:raw_url_collection) { build(:response_url_collection, :klass => described_class.base_class, :url => url) }
let(:raw_instance) { build(:response_instance, :job_template, :klass => described_class.base_class) }
let(:url) { "example.com/api/v1/job_templates" }
let(:api) { AnsibleTowerClient::Api.new(connection) }
let(:connection) { AnsibleTowerClient::MockApi.new("2.1") }
let(:raw_instance) { build(:response_instance, :job_template, :klass => described_class.base_class) }
let(:raw_instance_no_extra_vars) { build(:response_instance, :job_template, :klass => described_class.base_class, :extra_vars => '') }
let(:raw_instance_no_survey) { build(:response_instance, :job_template, :klass => described_class.base_class, :related => {}) }

include_examples "Crud Methods"
include_examples "Api Methods"
include_examples "Crud Methods"
include_examples "JobTemplate#extra_vars_hash"
include_examples "JobTemplate#initialize"
include_examples "JobTemplate#survey_spec"
include_examples "JobTemplate#survey_spec_hash"
include_examples "JobTemplate#extra_vars_hash"

describe '#launch' do
let(:json) { {'extra_vars' => "{\"instance_ids\":[\"i-999c\"],\"state\":\"absent\",\"subnet_id\":\"subnet-887\"}"} }
Expand Down
20 changes: 8 additions & 12 deletions spec/organization_spec.rb
Original file line number Diff line number Diff line change
@@ -1,20 +1,16 @@
describe AnsibleTowerClient::Organization do
let(:url) { "example.com/api/v1/organizations/13" }
let(:api) { AnsibleTowerClient::Api.new(instance_double("Faraday::Connection")) }
let(:collection) { api.organizations }
let(:raw_collection) { build(:response_collection, :klass => described_class) }
let(:raw_url_collection) { build(:response_url_collection, :klass => described_class, :url => url) }
let(:raw_instance) { build(:response_instance, :organization, :klass => described_class, :description => "The Organization", :name => "MyOrg") }
let(:api) { AnsibleTowerClient::Api.new(AnsibleTowerClient::MockApi.new) }
let(:raw_instance) { build(:response_instance, :organization, :klass => described_class, :description => "The Organization", :name => "MyOrg") }

include_examples "Crud Methods"

it "#initialize instantiates an #{described_class} from a hash" do
obj = described_class.new(instance_double("AnsibleTowerClient::Api"), raw_instance)
obj = api.organizations.all.first

expect(obj).to be_a described_class
expect(obj.id).to be_a Integer
expect(obj.url).to be_a String
expect(obj.description).to eq "The Organization"
expect(obj.name).to be_a String
expect(obj).to be_a described_class
expect(obj.id).to be_a Integer
expect(obj.url).to be_a String
expect(obj.description).to eq "The Organization"
expect(obj.name).to be_a String
end
end
Loading

0 comments on commit 9515317

Please sign in to comment.