gandi_v5 0.7.0 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +44 -0
- data/CHANGELOG.md +13 -0
- data/README.md +1 -0
- data/gandi_v5.gemspec +2 -2
- data/lib/gandi_v5/domain.rb +5 -3
- data/lib/gandi_v5/live_dns/domain.rb +2 -2
- data/lib/gandi_v5/sharing_space.rb +27 -0
- data/lib/gandi_v5/simple_hosting.rb +12 -0
- data/lib/gandi_v5/simple_hosting/instance.rb +242 -0
- data/lib/gandi_v5/simple_hosting/instance/application.rb +44 -0
- data/lib/gandi_v5/simple_hosting/instance/database.rb +19 -0
- data/lib/gandi_v5/simple_hosting/instance/language.rb +22 -0
- data/lib/gandi_v5/simple_hosting/instance/upgrade.rb +21 -0
- data/lib/gandi_v5/simple_hosting/instance/virtual_host.rb +187 -0
- data/lib/gandi_v5/simple_hosting/instance/virtual_host/linked_dns_zone.rb +74 -0
- data/lib/gandi_v5/version.rb +1 -1
- data/spec/.rubocop.yml +50 -3
- data/spec/fixtures/bodies/GandiV5_SimpleHosting_Instance/fetch.yml +80 -0
- data/spec/fixtures/bodies/GandiV5_SimpleHosting_Instance/list.yml +38 -0
- data/spec/fixtures/bodies/GandiV5_SimpleHosting_Instance_VirtualHost/fetch.yml +26 -0
- data/spec/fixtures/bodies/GandiV5_SimpleHosting_Instance_VirtualHost/list.yml +18 -0
- data/spec/units/gandi_v5/domain_spec.rb +1 -1
- data/spec/units/gandi_v5/sharing_space_spec.rb +4 -0
- data/spec/units/gandi_v5/simple_hosting/instance/application_spec.rb +37 -0
- data/spec/units/gandi_v5/simple_hosting/instance/database_spec.rb +4 -0
- data/spec/units/gandi_v5/simple_hosting/instance/language_spec.rb +4 -0
- data/spec/units/gandi_v5/simple_hosting/instance/upgrade_spec.rb +4 -0
- data/spec/units/gandi_v5/simple_hosting/instance/virtual_host/linked_dns_zone_spec.rb +50 -0
- data/spec/units/gandi_v5/simple_hosting/instance/virtual_host_spec.rb +199 -0
- data/spec/units/gandi_v5/simple_hosting/instance_spec.rb +182 -0
- data/spec/units/gandi_v5/simple_hosting_spec.rb +9 -0
- metadata +28 -8
- data/lib/gandi_v5/domain/sharing_space.rb +0 -29
- data/spec/units/gandi_v5/domain/sharing_space_spec.rb +0 -4
@@ -0,0 +1,38 @@
|
|
1
|
+
---
|
2
|
+
- available_upgrade: true
|
3
|
+
created_at: 2020-01-02T12:34:56+00
|
4
|
+
database:
|
5
|
+
name: database name
|
6
|
+
status: database status
|
7
|
+
version: database version
|
8
|
+
datacenter:
|
9
|
+
code: FR-SD5
|
10
|
+
name: SD5
|
11
|
+
region: FR
|
12
|
+
expire_at: 2021-01-02T12:34:56+00
|
13
|
+
id: instance-uuid
|
14
|
+
language:
|
15
|
+
name: ruby
|
16
|
+
single_application: true
|
17
|
+
status: great
|
18
|
+
version: "2.7"
|
19
|
+
name: instance name
|
20
|
+
sharing_space:
|
21
|
+
id: sharing-space-uuid
|
22
|
+
name: sharing space name
|
23
|
+
size: s+
|
24
|
+
snapshot_enabled: true
|
25
|
+
status: active
|
26
|
+
storage:
|
27
|
+
additional:
|
28
|
+
unit: GB
|
29
|
+
value: 10
|
30
|
+
base:
|
31
|
+
unit: GB
|
32
|
+
value: 20
|
33
|
+
total:
|
34
|
+
unit: GB
|
35
|
+
value: 30
|
36
|
+
autorenew:
|
37
|
+
duration: 1
|
38
|
+
duration_type: m
|
@@ -0,0 +1,26 @@
|
|
1
|
+
---
|
2
|
+
created_at: 2020-01-02T12:34:56+00
|
3
|
+
fqdn: vh.example.com
|
4
|
+
is_a_test_vhost: false
|
5
|
+
linked_dns_zone:
|
6
|
+
allow_alteration: true
|
7
|
+
cname: cn
|
8
|
+
domain: example.com
|
9
|
+
ipv4: 1.2.3.4
|
10
|
+
ipv6: 1:2::3:4
|
11
|
+
is_alterable: true
|
12
|
+
is_root: true
|
13
|
+
key: www
|
14
|
+
txt: abcd1234
|
15
|
+
last_checked_status: unknown
|
16
|
+
last_checked_at: 2020-02-03T23:45:56+00
|
17
|
+
status: running
|
18
|
+
application:
|
19
|
+
name: app-name
|
20
|
+
status: being_created
|
21
|
+
parameters: {}
|
22
|
+
certificates:
|
23
|
+
- href: example.com
|
24
|
+
id: cert-id
|
25
|
+
pending: true
|
26
|
+
https_strategy: redirect_HTTP_to_HTTPS
|
@@ -0,0 +1,18 @@
|
|
1
|
+
---
|
2
|
+
- created_at: 2020-01-02T12:34:56+00
|
3
|
+
fqdn: vh.example.com
|
4
|
+
is_a_test_vhost: false
|
5
|
+
linked_dns_zone:
|
6
|
+
allow_alteration: true
|
7
|
+
last_checked_status: unknown
|
8
|
+
last_checked_at: 2020-02-03T23:45:56+00
|
9
|
+
status: running
|
10
|
+
application:
|
11
|
+
name: app-name
|
12
|
+
status: being_created
|
13
|
+
parameters: {}
|
14
|
+
certificates:
|
15
|
+
- href: example.com
|
16
|
+
id: cert-id
|
17
|
+
pending: true
|
18
|
+
https_strategy: redirect_HTTP_to_HTTPS
|
@@ -45,7 +45,7 @@ describe GandiV5::Domain do
|
|
45
45
|
end
|
46
46
|
|
47
47
|
describe 'Passes optional query params' do
|
48
|
-
%i[fqdn sort_by tld].each do |param|
|
48
|
+
%i[fqdn sort_by tld resellee_id].each do |param|
|
49
49
|
it param.to_s do
|
50
50
|
expect(GandiV5).to receive(:paginated_get).with(url, (1..), 100, params: { param => 5 })
|
51
51
|
expect(described_class.list(param => 5)).to eq []
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
describe GandiV5::SimpleHosting::Instance::Application do
|
4
|
+
describe 'Helper methods' do
|
5
|
+
context 'being_created' do
|
6
|
+
subject { described_class.new status: :being_created }
|
7
|
+
its('being_created?') { should be true }
|
8
|
+
its('cancelled?') { should be false }
|
9
|
+
its('running?') { should be false }
|
10
|
+
its('error?') { should be false }
|
11
|
+
end
|
12
|
+
|
13
|
+
context 'cancelled' do
|
14
|
+
subject { described_class.new status: :cancelled }
|
15
|
+
its('being_created?') { should be false }
|
16
|
+
its('cancelled?') { should be true }
|
17
|
+
its('running?') { should be false }
|
18
|
+
its('error?') { should be false }
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'running' do
|
22
|
+
subject { described_class.new status: :running }
|
23
|
+
its('being_created?') { should be false }
|
24
|
+
its('cancelled?') { should be false }
|
25
|
+
its('running?') { should be true }
|
26
|
+
its('error?') { should be false }
|
27
|
+
end
|
28
|
+
|
29
|
+
context 'error' do
|
30
|
+
subject { described_class.new status: :error }
|
31
|
+
its('being_created?') { should be false }
|
32
|
+
its('cancelled?') { should be false }
|
33
|
+
its('running?') { should be false }
|
34
|
+
its('error?') { should be true }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
describe GandiV5::SimpleHosting::Instance::VirtualHost::LinkedDnsZone do
|
4
|
+
describe 'Helper methods' do
|
5
|
+
context 'altered' do
|
6
|
+
subject { described_class.new status: :altered }
|
7
|
+
its('altered?') { should be true }
|
8
|
+
its('livedns_conflict?') { should be false }
|
9
|
+
its('livedns_done?') { should be false }
|
10
|
+
its('livedns_error?') { should be false }
|
11
|
+
its('unknown?') { should be false }
|
12
|
+
end
|
13
|
+
|
14
|
+
context 'altered' do
|
15
|
+
subject { described_class.new status: :livedns_conflict }
|
16
|
+
its('altered?') { should be false }
|
17
|
+
its('livedns_conflict?') { should be true }
|
18
|
+
its('livedns_done?') { should be false }
|
19
|
+
its('livedns_error?') { should be false }
|
20
|
+
its('unknown?') { should be false }
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'livedns_done' do
|
24
|
+
subject { described_class.new status: :livedns_done }
|
25
|
+
its('altered?') { should be false }
|
26
|
+
its('livedns_conflict?') { should be false }
|
27
|
+
its('livedns_done?') { should be true }
|
28
|
+
its('livedns_error?') { should be false }
|
29
|
+
its('unknown?') { should be false }
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'livedns_error' do
|
33
|
+
subject { described_class.new status: :livedns_error }
|
34
|
+
its('altered?') { should be false }
|
35
|
+
its('livedns_conflict?') { should be false }
|
36
|
+
its('livedns_done?') { should be false }
|
37
|
+
its('livedns_error?') { should be true }
|
38
|
+
its('unknown?') { should be false }
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'unknown' do
|
42
|
+
subject { described_class.new status: :unknown }
|
43
|
+
its('altered?') { should be false }
|
44
|
+
its('livedns_conflict?') { should be false }
|
45
|
+
its('livedns_done?') { should be false }
|
46
|
+
its('livedns_error?') { should be false }
|
47
|
+
its('unknown?') { should be true }
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,199 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
describe GandiV5::SimpleHosting::Instance::VirtualHost do
|
4
|
+
let :body_list do
|
5
|
+
YAML.load_file(
|
6
|
+
File.expand_path(
|
7
|
+
File.join('spec', 'fixtures', 'bodies', 'GandiV5_SimpleHosting_Instance_VirtualHost', 'list.yml')
|
8
|
+
)
|
9
|
+
)
|
10
|
+
end
|
11
|
+
let :body_fetch do
|
12
|
+
YAML.load_file(
|
13
|
+
File.expand_path(
|
14
|
+
File.join('spec', 'fixtures', 'bodies', 'GandiV5_SimpleHosting_Instance_VirtualHost', 'fetch.yml')
|
15
|
+
)
|
16
|
+
)
|
17
|
+
end
|
18
|
+
|
19
|
+
subject do
|
20
|
+
described_class.new instance_uuid: 'instance-uuid', fqdn: 'vh.example.com'
|
21
|
+
end
|
22
|
+
|
23
|
+
it '#refresh' do
|
24
|
+
url = 'https://api.gandi.net/v5/simplehosting/instances/instance-uuid/vhosts/vh.example.com'
|
25
|
+
expect(GandiV5).to receive(:get).with(url)
|
26
|
+
.and_return([nil, body_fetch])
|
27
|
+
subject.refresh
|
28
|
+
expect(subject.linked_dns_zone.cname).to_not be nil
|
29
|
+
end
|
30
|
+
|
31
|
+
describe 'Helper methods' do
|
32
|
+
describe 'Status' do
|
33
|
+
context 'being_created' do
|
34
|
+
subject { described_class.new status: :being_created }
|
35
|
+
its('being_created?') { should be true }
|
36
|
+
its('running?') { should be false }
|
37
|
+
its('being_deleted?') { should be false }
|
38
|
+
its('locked?') { should be false }
|
39
|
+
its('waiting_ownership?') { should be false }
|
40
|
+
its('ownership_validated?') { should be false }
|
41
|
+
its('validation_failed?') { should be false }
|
42
|
+
end
|
43
|
+
context 'running' do
|
44
|
+
subject { described_class.new status: :running }
|
45
|
+
its('being_created?') { should be false }
|
46
|
+
its('running?') { should be true }
|
47
|
+
its('being_deleted?') { should be false }
|
48
|
+
its('locked?') { should be false }
|
49
|
+
its('waiting_ownership?') { should be false }
|
50
|
+
its('ownership_validated?') { should be false }
|
51
|
+
its('validation_failed?') { should be false }
|
52
|
+
end
|
53
|
+
context 'being_deleted' do
|
54
|
+
subject { described_class.new status: :being_deleted }
|
55
|
+
its('being_created?') { should be false }
|
56
|
+
its('running?') { should be false }
|
57
|
+
its('being_deleted?') { should be true }
|
58
|
+
its('locked?') { should be false }
|
59
|
+
its('waiting_ownership?') { should be false }
|
60
|
+
its('ownership_validated?') { should be false }
|
61
|
+
its('validation_failed?') { should be false }
|
62
|
+
end
|
63
|
+
context 'locked' do
|
64
|
+
subject { described_class.new status: :locked }
|
65
|
+
its('being_created?') { should be false }
|
66
|
+
its('running?') { should be false }
|
67
|
+
its('being_deleted?') { should be false }
|
68
|
+
its('locked?') { should be true }
|
69
|
+
its('waiting_ownership?') { should be false }
|
70
|
+
its('ownership_validated?') { should be false }
|
71
|
+
its('validation_failed?') { should be false }
|
72
|
+
end
|
73
|
+
context 'waiting_ownership' do
|
74
|
+
subject { described_class.new status: :waiting_ownership }
|
75
|
+
its('being_created?') { should be false }
|
76
|
+
its('running?') { should be false }
|
77
|
+
its('being_deleted?') { should be false }
|
78
|
+
its('locked?') { should be false }
|
79
|
+
its('waiting_ownership?') { should be true }
|
80
|
+
its('ownership_validated?') { should be false }
|
81
|
+
its('validation_failed?') { should be false }
|
82
|
+
end
|
83
|
+
context 'ownership_validated' do
|
84
|
+
subject { described_class.new status: :ownership_validated }
|
85
|
+
its('being_created?') { should be false }
|
86
|
+
its('running?') { should be false }
|
87
|
+
its('being_deleted?') { should be false }
|
88
|
+
its('locked?') { should be false }
|
89
|
+
its('waiting_ownership?') { should be false }
|
90
|
+
its('ownership_validated?') { should be true }
|
91
|
+
its('validation_failed?') { should be false }
|
92
|
+
end
|
93
|
+
context 'validation_failed' do
|
94
|
+
subject { described_class.new status: :validation_failed }
|
95
|
+
its('being_created?') { should be false }
|
96
|
+
its('running?') { should be false }
|
97
|
+
its('being_deleted?') { should be false }
|
98
|
+
its('locked?') { should be false }
|
99
|
+
its('waiting_ownership?') { should be false }
|
100
|
+
its('ownership_validated?') { should be false }
|
101
|
+
its('validation_failed?') { should be true }
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
describe 'HTTP(S)' do
|
106
|
+
context 'HTTP_only' do
|
107
|
+
subject { described_class.new https_strategy: :http_only }
|
108
|
+
its('http_only?') { should be true }
|
109
|
+
its('http_and_https?') { should be false }
|
110
|
+
its('redirect_http_to_https?') { should be false }
|
111
|
+
its('http?') { should be true }
|
112
|
+
its('https?') { should be false }
|
113
|
+
end
|
114
|
+
context 'HTTP_and_HTTPS' do
|
115
|
+
subject { described_class.new https_strategy: :http_and_https }
|
116
|
+
its('http_only?') { should be false }
|
117
|
+
its('http_and_https?') { should be true }
|
118
|
+
its('redirect_http_to_https?') { should be false }
|
119
|
+
its('http?') { should be true }
|
120
|
+
its('https?') { should be true }
|
121
|
+
end
|
122
|
+
context 'redirect_HTTP_to_HTTPS' do
|
123
|
+
subject { described_class.new https_strategy: :redirect_http_to_https }
|
124
|
+
its('http_only?') { should be false }
|
125
|
+
its('http_and_https?') { should be false }
|
126
|
+
its('redirect_http_to_https?') { should be true }
|
127
|
+
its('http?') { should be false }
|
128
|
+
its('https?') { should be false }
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
describe '.list' do
|
134
|
+
subject { described_class.list('instance-uuid') }
|
135
|
+
let(:url) { 'https://api.gandi.net/v5/simplehosting/instances/instance-uuid/vhosts' }
|
136
|
+
|
137
|
+
describe 'With default parameters' do
|
138
|
+
before :each do
|
139
|
+
expect(GandiV5).to receive(:paginated_get).with(url, (1..), 100, params: {})
|
140
|
+
.and_yield(body_list)
|
141
|
+
end
|
142
|
+
|
143
|
+
its('count') { should eq 1 }
|
144
|
+
its('first.created_at') { should eq Time.new(2020, 1, 2, 12, 34, 56, 0) }
|
145
|
+
its('first.fqdn') { should eq 'vh.example.com' }
|
146
|
+
its('first.is_a_test_virtual_host') { should be false }
|
147
|
+
its('first.linked_dns_zone.allow_alteration') { should be true }
|
148
|
+
its('first.linked_dns_zone.status') { should eq :unknown }
|
149
|
+
its('first.linked_dns_zone.last_checked_at') { should eq Time.new(2020, 2, 3, 23, 45, 56, 0) }
|
150
|
+
its('first.status') { should eq :running }
|
151
|
+
its('first.application.name') { should eq 'app-name' }
|
152
|
+
its('first.application.status') { should eq :being_created }
|
153
|
+
its('first.application.parameters') { should eq({}) }
|
154
|
+
its('first.certificates') { should eq({ 'cert-id' => true }) }
|
155
|
+
its('first.https_strategy') { should eq :redirect_http_to_https }
|
156
|
+
end
|
157
|
+
|
158
|
+
describe 'Passes optional query params' do
|
159
|
+
%i[fqdn status sort_by].each do |param|
|
160
|
+
it param do
|
161
|
+
expect(GandiV5).to receive(:paginated_get).with(url, (1..), 100, params: { param => 'value' })
|
162
|
+
.and_return([nil, []])
|
163
|
+
described_class.list('instance-uuid', param => 'value')
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
describe '.fetch' do
|
170
|
+
subject { described_class.fetch 'instance-uuid', 'vh.example.com' }
|
171
|
+
|
172
|
+
before :each do
|
173
|
+
url = 'https://api.gandi.net/v5/simplehosting/instances/instance-uuid/vhosts/vh.example.com'
|
174
|
+
expect(GandiV5).to receive(:get).with(url)
|
175
|
+
.and_return([nil, body_fetch])
|
176
|
+
end
|
177
|
+
|
178
|
+
its('created_at') { should eq Time.new(2020, 1, 2, 12, 34, 56, 0) }
|
179
|
+
its('fqdn') { should eq 'vh.example.com' }
|
180
|
+
its('is_a_test_virtual_host') { should be false }
|
181
|
+
its('linked_dns_zone.allow_alteration') { should be true }
|
182
|
+
its('linked_dns_zone.cname') { should eq 'cn' }
|
183
|
+
its('linked_dns_zone.domain') { should eq 'example.com' }
|
184
|
+
its('linked_dns_zone.ipv4') { should eq '1.2.3.4' }
|
185
|
+
its('linked_dns_zone.ipv6') { should eq '1:2::3:4' }
|
186
|
+
its('linked_dns_zone.is_alterable') { should be true }
|
187
|
+
its('linked_dns_zone.is_root') { should be true }
|
188
|
+
its('linked_dns_zone.key') { should eq 'www' }
|
189
|
+
its('linked_dns_zone.txt') { should eq 'abcd1234' }
|
190
|
+
its('linked_dns_zone.status') { should eq :unknown }
|
191
|
+
its('linked_dns_zone.last_checked_at') { should eq Time.new(2020, 2, 3, 23, 45, 56, 0) }
|
192
|
+
its('status') { should eq :running }
|
193
|
+
its('application.name') { should eq 'app-name' }
|
194
|
+
its('application.status') { should eq :being_created }
|
195
|
+
its('application.parameters') { should eq({}) }
|
196
|
+
its('certificates') { should eq({ 'cert-id' => true }) }
|
197
|
+
its('https_strategy') { should eq :redirect_http_to_https }
|
198
|
+
end
|
199
|
+
end
|
@@ -0,0 +1,182 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
describe GandiV5::SimpleHosting::Instance do
|
4
|
+
let :body_list do
|
5
|
+
YAML.load_file(
|
6
|
+
File.expand_path(
|
7
|
+
File.join('spec', 'fixtures', 'bodies', 'GandiV5_SimpleHosting_Instance', 'list.yml')
|
8
|
+
)
|
9
|
+
)
|
10
|
+
end
|
11
|
+
let :body_fetch do
|
12
|
+
YAML.load_file(
|
13
|
+
File.expand_path(
|
14
|
+
File.join('spec', 'fixtures', 'bodies', 'GandiV5_SimpleHosting_Instance', 'fetch.yml')
|
15
|
+
)
|
16
|
+
)
|
17
|
+
end
|
18
|
+
|
19
|
+
subject do
|
20
|
+
described_class.new uuid: 'instance-uuid'
|
21
|
+
end
|
22
|
+
|
23
|
+
describe 'Actions' do
|
24
|
+
let(:url) { 'https://api.gandi.net/v5/simplehosting/instances/instance-uuid/action' }
|
25
|
+
|
26
|
+
%i[restart console reset_database_password].each do |action|
|
27
|
+
it ".#{action}" do
|
28
|
+
expect(GandiV5).to receive(:post).with(url, "{\"action\":\"#{action}\"}")
|
29
|
+
.and_return([nil, 'Confirmation message'])
|
30
|
+
expect(subject.send(action)).to eq 'Confirmation message'
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
it '#refresh' do
|
36
|
+
expect(GandiV5).to receive(:get).with('https://api.gandi.net/v5/simplehosting/instances/instance-uuid')
|
37
|
+
.and_return([nil, body_fetch])
|
38
|
+
subject.refresh
|
39
|
+
expect(subject.access_information).to_not be nil
|
40
|
+
end
|
41
|
+
|
42
|
+
describe 'Helper methods' do
|
43
|
+
describe 'Status' do
|
44
|
+
context 'waiting_bill' do
|
45
|
+
subject { described_class.new status: :waiting_bill }
|
46
|
+
its('waiting_bill?') { should be true }
|
47
|
+
its('being_created?') { should be false }
|
48
|
+
its('active?') { should be false }
|
49
|
+
its('paused?') { should be false }
|
50
|
+
its('locked?') { should be false }
|
51
|
+
its('being_deleted?') { should be false }
|
52
|
+
end
|
53
|
+
context 'being_created' do
|
54
|
+
subject { described_class.new status: :being_created }
|
55
|
+
its('waiting_bill?') { should be false }
|
56
|
+
its('being_created?') { should be true }
|
57
|
+
its('active?') { should be false }
|
58
|
+
its('paused?') { should be false }
|
59
|
+
its('locked?') { should be false }
|
60
|
+
its('being_deleted?') { should be false }
|
61
|
+
end
|
62
|
+
context 'active' do
|
63
|
+
subject { described_class.new status: :active }
|
64
|
+
its('waiting_bill?') { should be false }
|
65
|
+
its('being_created?') { should be false }
|
66
|
+
its('active?') { should be true }
|
67
|
+
its('paused?') { should be false }
|
68
|
+
its('locked?') { should be false }
|
69
|
+
its('being_deleted?') { should be false }
|
70
|
+
end
|
71
|
+
context 'paused' do
|
72
|
+
subject { described_class.new status: :paused }
|
73
|
+
its('waiting_bill?') { should be false }
|
74
|
+
its('being_created?') { should be false }
|
75
|
+
its('active?') { should be false }
|
76
|
+
its('paused?') { should be true }
|
77
|
+
its('locked?') { should be false }
|
78
|
+
its('being_deleted?') { should be false }
|
79
|
+
end
|
80
|
+
context 'locked' do
|
81
|
+
subject { described_class.new status: :locked }
|
82
|
+
its('waiting_bill?') { should be false }
|
83
|
+
its('being_created?') { should be false }
|
84
|
+
its('active?') { should be false }
|
85
|
+
its('paused?') { should be false }
|
86
|
+
its('locked?') { should be true }
|
87
|
+
its('being_deleted?') { should be false }
|
88
|
+
end
|
89
|
+
context 'being_deleted' do
|
90
|
+
subject { described_class.new status: :being_deleted }
|
91
|
+
its('waiting_bill?') { should be false }
|
92
|
+
its('being_created?') { should be false }
|
93
|
+
its('active?') { should be false }
|
94
|
+
its('paused?') { should be false }
|
95
|
+
its('locked?') { should be false }
|
96
|
+
its('being_deleted?') { should be true }
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
describe '.list' do
|
102
|
+
subject { described_class.list }
|
103
|
+
let(:url) { 'https://api.gandi.net/v5/simplehosting/instances' }
|
104
|
+
|
105
|
+
describe 'With default parameters' do
|
106
|
+
before :each do
|
107
|
+
expect(GandiV5).to receive(:paginated_get).with(url, (1..), 100, params: {})
|
108
|
+
.and_yield(body_list)
|
109
|
+
end
|
110
|
+
|
111
|
+
its('count') { should eq 1 }
|
112
|
+
its('first.created_at') { should eq Time.new(2020, 1, 2, 12, 34, 56) }
|
113
|
+
its('first.database.name') { should eq 'database name' }
|
114
|
+
its('first.database.status') { should eq 'database status' }
|
115
|
+
its('first.database.version') { should eq 'database version' }
|
116
|
+
its('first.data_center') { should eq 'FR-SD5' }
|
117
|
+
its('first.expire_at') { should eq Time.new(2021, 1, 2, 12, 34, 56) }
|
118
|
+
its('first.uuid') { should eq 'instance-uuid' }
|
119
|
+
its('first.language.name') { should eq 'ruby' }
|
120
|
+
its('first.language.single_application') { should be true }
|
121
|
+
its('first.language.status') { should eq 'great' }
|
122
|
+
its('first.language.version') { should eq '2.7' }
|
123
|
+
its('first.name') { should eq 'instance name' }
|
124
|
+
its('first.sharing_space.uuid') { should eq 'sharing-space-uuid' }
|
125
|
+
its('first.sharing_space.name') { should eq 'sharing space name' }
|
126
|
+
its('first.size') { should eq 's+' }
|
127
|
+
its('first.snapshot_enabled') { should be true }
|
128
|
+
its('first.status') { should eq 'active' }
|
129
|
+
its('first.storage') { should eq({ base: '20 GB', additional: '10 GB', total: '30 GB' }) }
|
130
|
+
its('first.auto_renew') { should eq '1 m' }
|
131
|
+
end
|
132
|
+
|
133
|
+
describe 'Passes optional query params' do
|
134
|
+
%i[sharing_id name fqdn size status sort_by].each do |param|
|
135
|
+
it param do
|
136
|
+
expect(GandiV5).to receive(:paginated_get).with(url, (1..), 100, params: { param => 'value' })
|
137
|
+
.and_return([nil, []])
|
138
|
+
described_class.list(param => 'value')
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
describe '.fetch' do
|
145
|
+
subject { described_class.fetch 'instance-uuid' }
|
146
|
+
|
147
|
+
before :each do
|
148
|
+
expect(GandiV5).to receive(:get).with('https://api.gandi.net/v5/simplehosting/instances/instance-uuid')
|
149
|
+
.and_return([nil, body_fetch])
|
150
|
+
end
|
151
|
+
|
152
|
+
its('access_information') { should be_a Hash }
|
153
|
+
its('created_at') { should eq Time.new(2020, 1, 2, 12, 34, 56, 0) }
|
154
|
+
its('database.name') { should eq 'database name' }
|
155
|
+
its('database.status') { should eq 'database status' }
|
156
|
+
its('database.version') { should eq 'database version' }
|
157
|
+
its('data_center') { should eq 'FR-SD5' }
|
158
|
+
its('expire_at') { should eq Time.new(2021, 1, 2, 12, 34, 56, 0) }
|
159
|
+
its('uuid') { should eq 'instance-uuid' }
|
160
|
+
its('is_trial') { should be false }
|
161
|
+
its('language.name') { should eq 'ruby' }
|
162
|
+
its('language.single_application') { should be true }
|
163
|
+
its('language.status') { should eq 'great' }
|
164
|
+
its('language.version') { should eq '2.7' }
|
165
|
+
its('name') { should eq 'instance name' }
|
166
|
+
its('sharing_space.uuid') { should eq 'sharing-space-uuid' }
|
167
|
+
its('sharing_space.name') { should eq 'sharing space name' }
|
168
|
+
its('size') { should eq 's+' }
|
169
|
+
its('snapshot_enabled') { should be true }
|
170
|
+
its('status') { should eq 'active' }
|
171
|
+
its('storage') { should eq({ base: '20 GB', additional: '10 GB', total: '30 GB' }) }
|
172
|
+
its('virtual_hosts.first.fqdn') { should eq 'vhost1.example.com' }
|
173
|
+
its('auto_renew') { should eq '1 m' }
|
174
|
+
its('compatible_applications.first.name') { should eq 'compatable name' }
|
175
|
+
its('compatible_applications.first.parameters') { should be_a Hash }
|
176
|
+
its('password_updated_at') { should eq Time.new(2020, 6, 2, 12, 34, 56, 0) }
|
177
|
+
its('upgrade_to.first.name') { should eq 'upgrade to name' }
|
178
|
+
its('upgrade_to.first.status') { should eq 'upgrade to status' }
|
179
|
+
its('upgrade_to.first.type') { should eq 'database' }
|
180
|
+
its('upgrade_to.first.version') { should eq 'upgrade to version' }
|
181
|
+
end
|
182
|
+
end
|