-
Notifications
You must be signed in to change notification settings - Fork 582
/
Copy pathloadjson_spec.rb
121 lines (101 loc) · 4.28 KB
/
loadjson_spec.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# frozen_string_literal: true
require 'spec_helper'
require 'open-uri'
require 'stringio'
describe 'stdlib::loadjson' do
it { is_expected.not_to be_nil }
it { is_expected.to run.with_params.and_raise_error(ArgumentError, "'stdlib::loadjson' expects between 1 and 2 arguments, got none") }
describe 'when calling with valid arguments' do
context 'when a non-existing file is specified' do
let(:filename) do
file = Tempfile.create
file.close
File.unlink(file.path)
file.path
end
before(:each) do
if Puppet::PUPPETVERSION[0].to_i < 8
allow(PSON).to receive(:load).never # rubocop:disable RSpec/ReceiveNever Switching to not_to receive breaks testing in this case
else
allow(JSON).to receive(:parse).never # rubocop:disable RSpec/ReceiveNever
end
end
it { is_expected.to run.with_params(filename, {'default' => 'value'}).and_return({'default' => 'value'}) }
it { is_expected.to run.with_params(filename, {'đẽƒằưļŧ' => '٧ẵłựέ'}).and_return({'đẽƒằưļŧ' => '٧ẵłựέ'}) }
it { is_expected.to run.with_params(filename, {'デフォルト' => '値'}).and_return({'デフォルト' => '値'}) }
end
context 'when an existing file is specified' do
let(:data) { { 'key' => 'value', 'ķęŷ' => 'νậŀųề', 'キー' => '値' } }
let(:json) { '{"key":"value", {"ķęŷ":"νậŀųề" }, {"キー":"値" }' }
it do
Tempfile.new do |file|
file.write(json)
file.flush
is_expected.to run.with_params(file.path).and_return(data)
end
end
end
context 'when the file could not be parsed' do
let(:json) { '{"key":"value"}' }
it do
Tempfile.new do |file|
file.write(json)
file.flush
is_expected.to run.with_params(filename, {'default' => 'value'}).and_return({'default' => 'value'})
end
end
end
context 'when an existing URL with username and password is specified' do
let(:filename) do
'https://user1:[email protected]/myhash.json'
end
it do
uri = URI.parse(filename)
allow(URI).to receive(:parse).and_call_original
expect(URI).to receive(:parse).with(filename).and_return(uri)
expect(uri).to receive(:open).with(http_basic_authentication: ['user1', 'pass1']).and_yield(StringIO.new('{"key":"value"}'))
is_expected.to run.with_params(filename).and_return({'key' => 'value'})
expect(uri.user).to be_nil
end
end
context 'when an existing URL is specified' do
let(:filename) do
'https://example.com/myhash.json'
end
let(:data) { { 'key' => 'value', 'ķęŷ' => 'νậŀųề', 'キー' => '値' } }
let(:json) { '{"key":"value", "ķęŷ":"νậŀųề", "キー":"値" }' }
it {
uri = URI.parse(filename)
allow(URI).to receive(:parse).and_call_original
expect(URI).to receive(:parse).with(filename).and_return(uri)
expect(uri).to receive(:open).with(no_args).and_yield(StringIO.new(json))
expect(subject).to run.with_params(filename).and_return(data)
}
end
context 'when the URL output could not be parsed, with default specified' do
let(:filename) do
'https://example.com/myhash.json'
end
let(:json) { ',;{"key":"value"}' }
it {
uri = URI.parse(filename)
allow(URI).to receive(:parse).and_call_original
expect(URI).to receive(:parse).with(filename).and_return(uri)
expect(uri).to receive(:open).with(no_args).and_yield(StringIO.new(json))
expect(subject).to run.with_params(filename, {'default' => 'value'}).and_return({'default' => 'value'})
}
end
context 'when the URL does not exist, with default specified' do
let(:filename) do
'https://example.com/myhash.json'
end
it {
uri = URI.parse(filename)
allow(URI).to receive(:parse).and_call_original
expect(URI).to receive(:parse).with(filename).and_return(uri)
expect(uri).to receive(:open).with(no_args).and_raise(OpenURI::HTTPError, '404 File not Found')
expect(subject).to run.with_params(filename, {'default' => 'value'}).and_return({'default' => 'value'})
}
end
end
end