3 require 'puppet/provider/openstack'
5 describe Puppet::Provider::Openstack do
7 ENV['OS_USERNAME'] = nil
8 ENV['OS_PASSWORD'] = nil
9 ENV['OS_PROJECT_NAME'] = nil
10 ENV['OS_AUTH_URL'] = nil
14 Puppet::Type.newtype(:test_resource) do
15 newparam(:name, :namevar => true)
20 describe '#request' do
21 let(:resource_attrs) do
23 :name => 'stubresource',
28 Puppet::Provider::Openstack.new(type.new(resource_attrs))
31 it 'makes a successful request' do
32 provider.class.stubs(:openstack)
33 .with('project', 'list', '--quiet', '--format', 'csv', ['--long'])
34 .returns('"ID","Name","Description","Enabled"
35 "1cb05cfed7c24279be884ba4f6520262","test","Test tenant",True
37 response = Puppet::Provider::Openstack.request('project', 'list', ['--long'])
38 expect(response.first[:description]).to eq("Test tenant")
41 context 'on connection errors' do
43 ENV['OS_USERNAME'] = 'test'
44 ENV['OS_PASSWORD'] = 'abc123'
45 ENV['OS_PROJECT_NAME'] = 'test'
46 ENV['OS_AUTH_URL'] = 'http://127.0.0.1:5000'
47 provider.class.stubs(:openstack)
48 .with('project', 'list', '--quiet', '--format', 'csv', ['--long'])
49 .raises(Puppet::ExecutionFailure, 'Unable to establish connection')
52 provider.class.expects(:sleep).with(2).returns(nil)
53 Puppet::Provider::Openstack.request('project', 'list', ['--long'])
58 describe 'parse_csv' do
59 context 'with mixed stderr' do
60 text = "ERROR: Testing\n\"field\",\"test\",1,2,3\n"
61 csv = Puppet::Provider::Openstack.parse_csv(text)
62 it 'should ignore non-CSV text at the beginning of the input' do
63 expect(csv).to be_kind_of(Array)
64 expect(csv[0]).to match_array(['field', 'test', '1', '2', '3'])
65 expect(csv.size).to eq(1)
69 context 'with \r\n line endings' do
70 text = "ERROR: Testing\r\n\"field\",\"test\",1,2,3\r\n"
71 csv = Puppet::Provider::Openstack.parse_csv(text)
72 it 'ignore the carriage returns' do
73 expect(csv).to be_kind_of(Array)
74 expect(csv[0]).to match_array(['field', 'test', '1', '2', '3'])
75 expect(csv.size).to eq(1)
79 context 'with embedded newlines' do
80 text = "ERROR: Testing\n\"field\",\"te\nst\",1,2,3\n"
81 csv = Puppet::Provider::Openstack.parse_csv(text)
82 it 'should parse correctly' do
83 expect(csv).to be_kind_of(Array)
84 expect(csv[0]).to match_array(['field', "te\nst", '1', '2', '3'])
85 expect(csv.size).to eq(1)