cloudflare 4.0.1 → 4.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +13 -5
- data/.travis.yml +13 -2
- data/Gemfile +20 -0
- data/README.md +15 -4
- data/cloudflare.gemspec +1 -1
- data/lib/cloudflare.rb +5 -5
- data/lib/cloudflare/accounts.rb +12 -16
- data/lib/cloudflare/connection.rb +14 -10
- data/lib/cloudflare/custom_hostname/ssl_attribute.rb +62 -0
- data/lib/cloudflare/custom_hostname/ssl_attribute/settings.rb +71 -0
- data/lib/cloudflare/custom_hostnames.rb +82 -0
- data/lib/cloudflare/dns.rb +16 -20
- data/lib/cloudflare/firewall.rb +9 -16
- data/lib/cloudflare/kv/namespaces.rb +78 -0
- data/lib/cloudflare/paginate.rb +19 -21
- data/lib/cloudflare/representation.rb +32 -15
- data/lib/cloudflare/rspec/connection.rb +13 -1
- data/lib/cloudflare/version.rb +1 -1
- data/lib/cloudflare/zones.rb +13 -17
- data/spec/cloudflare/accounts_spec.rb +24 -0
- data/spec/cloudflare/custom_hostname/ssl_attribute/settings_spec.rb +54 -0
- data/spec/cloudflare/custom_hostname/ssl_attribute_spec.rb +73 -0
- data/spec/cloudflare/custom_hostnames_spec.rb +213 -0
- data/spec/cloudflare/dns_spec.rb +24 -6
- data/spec/cloudflare/kv/namespaces_spec.rb +71 -0
- data/spec/cloudflare/zone_spec.rb +13 -11
- data/spec/spec_helper.rb +60 -9
- metadata +21 -7
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RSpec.describe Cloudflare::Accounts, order: :defined, timeout: 30 do
|
4
|
+
include_context Cloudflare::Account
|
5
|
+
|
6
|
+
before do
|
7
|
+
account.id # Force a fetch if it hasn't happened yet
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'can list existing accounts' do
|
11
|
+
accounts = connection.accounts.to_a
|
12
|
+
expect(accounts.any? {|a| a.id == account.id }).to be true
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'can get a specific account' do
|
16
|
+
expect(connection.accounts.find_by_id(account.id).id).to eq account.id
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'can generate a representation for the KV namespace endpoint' do
|
20
|
+
ns = connection.accounts.find_by_id(account.id).kv_namespaces
|
21
|
+
expect(ns).to be_kind_of(Cloudflare::KV::Namespaces)
|
22
|
+
expect(ns.resource.reference.path).to end_with("/#{account.id}/storage/kv/namespaces")
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
RSpec.describe Cloudflare::CustomHostname::SSLAttribute::Settings do
|
2
|
+
|
3
|
+
subject { described_class.new({}) }
|
4
|
+
|
5
|
+
it 'has an accessor for ciphers' do
|
6
|
+
ciphers = double
|
7
|
+
expect(subject.ciphers).to be_nil
|
8
|
+
subject.ciphers = ciphers
|
9
|
+
expect(subject.ciphers).to be ciphers
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'has a boolean accessor for http2' do
|
13
|
+
expect(subject.http2).to be_nil
|
14
|
+
expect(subject.http2?).to be false
|
15
|
+
subject.http2 = true
|
16
|
+
expect(subject.http2).to eq 'on'
|
17
|
+
expect(subject.http2?).to be true
|
18
|
+
subject.http2 = false
|
19
|
+
expect(subject.http2).to eq 'off'
|
20
|
+
expect(subject.http2?).to be false
|
21
|
+
subject.http2 = 'on'
|
22
|
+
expect(subject.http2).to eq 'on'
|
23
|
+
expect(subject.http2?).to be true
|
24
|
+
subject.http2 = 'off'
|
25
|
+
expect(subject.http2).to eq 'off'
|
26
|
+
expect(subject.http2?).to be false
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'has an accessor for min_tls_version' do
|
30
|
+
tls_version = double
|
31
|
+
expect(subject.min_tls_version).to be_nil
|
32
|
+
subject.min_tls_version = tls_version
|
33
|
+
expect(subject.min_tls_version).to be tls_version
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'has a boolean accessor for tls_1_3' do
|
37
|
+
expect(subject.tls_1_3).to be_nil
|
38
|
+
expect(subject.tls_1_3?).to be false
|
39
|
+
subject.tls_1_3 = true
|
40
|
+
expect(subject.tls_1_3).to eq 'on'
|
41
|
+
expect(subject.tls_1_3?).to be true
|
42
|
+
subject.tls_1_3 = false
|
43
|
+
expect(subject.tls_1_3).to eq 'off'
|
44
|
+
expect(subject.tls_1_3?).to be false
|
45
|
+
subject.tls_1_3 = 'on'
|
46
|
+
expect(subject.tls_1_3).to eq 'on'
|
47
|
+
expect(subject.tls_1_3?).to be true
|
48
|
+
subject.tls_1_3 = 'off'
|
49
|
+
expect(subject.tls_1_3).to eq 'off'
|
50
|
+
expect(subject.tls_1_3?).to be false
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
RSpec.describe Cloudflare::CustomHostname::SSLAttribute do
|
2
|
+
|
3
|
+
accessors = [:cname, :cname_target, :http_body, :http_url, :method, :status, :type, :validation_errors]
|
4
|
+
|
5
|
+
let(:original_hash) { {} }
|
6
|
+
|
7
|
+
subject { described_class.new(original_hash) }
|
8
|
+
|
9
|
+
accessors.each do |key|
|
10
|
+
|
11
|
+
it "has an accessor for the #{key} value" do
|
12
|
+
test_value = double
|
13
|
+
expect(subject.send(key)).to be_nil
|
14
|
+
original_hash[key] = test_value
|
15
|
+
expect(subject.send(key)).to be test_value
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
it '#active? returns true when the status is "active" and false otherwise' do
|
21
|
+
expect(subject.active?).to be false
|
22
|
+
original_hash[:status] = 'initializing'
|
23
|
+
expect(subject.active?).to be false
|
24
|
+
original_hash[:status] = 'pending_validation'
|
25
|
+
expect(subject.active?).to be false
|
26
|
+
original_hash[:status] = 'pending_deployment'
|
27
|
+
expect(subject.active?).to be false
|
28
|
+
original_hash[:status] = 'active'
|
29
|
+
expect(subject.active?).to be true
|
30
|
+
end
|
31
|
+
|
32
|
+
it '#pending_validation? returns true when the status is "pending_validation" and false otherwise' do
|
33
|
+
expect(subject.pending_validation?).to be false
|
34
|
+
original_hash[:status] = 'initializing'
|
35
|
+
expect(subject.pending_validation?).to be false
|
36
|
+
original_hash[:status] = 'active'
|
37
|
+
expect(subject.pending_validation?).to be false
|
38
|
+
original_hash[:status] = 'pending_deployment'
|
39
|
+
expect(subject.pending_validation?).to be false
|
40
|
+
original_hash[:status] = 'pending_validation'
|
41
|
+
expect(subject.pending_validation?).to be true
|
42
|
+
end
|
43
|
+
|
44
|
+
describe '#settings' do
|
45
|
+
|
46
|
+
it 'should return a Settings object' do
|
47
|
+
expect(subject.settings).to be_kind_of Cloudflare::CustomHostname::SSLAttribute::Settings
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'initailizes the settings object with the value from the settings key' do
|
51
|
+
settings = { min_tls_version: double }
|
52
|
+
original_hash[:settings] = settings
|
53
|
+
expect(subject.settings.min_tls_version).to be settings[:min_tls_version]
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'initializes the settings object with a new hash if the settings key does not exist' do
|
57
|
+
expected_value = double
|
58
|
+
expect(original_hash[:settings]).to be_nil
|
59
|
+
expect(subject.settings.min_tls_version).to be_nil
|
60
|
+
expect(original_hash[:settings]).not_to be_nil
|
61
|
+
original_hash[:settings][:min_tls_version] = expected_value
|
62
|
+
expect(subject.settings.min_tls_version).to be expected_value
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'updates the stored hash with values set on the settings object' do
|
66
|
+
expected_value = double
|
67
|
+
expect(subject.settings.min_tls_version).to be_nil
|
68
|
+
subject.settings.min_tls_version = expected_value
|
69
|
+
expect(original_hash[:settings][:min_tls_version]).to be expected_value
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
@@ -0,0 +1,213 @@
|
|
1
|
+
|
2
|
+
RSpec.xdescribe Cloudflare::CustomHostnames, order: :defined, timeout: 30 do
|
3
|
+
include_context Cloudflare::Zone
|
4
|
+
|
5
|
+
let(:domain) { "www#{ENV['TRAVIS_JOB_ID'] || rand(1..5)}.ourtest.com" }
|
6
|
+
|
7
|
+
let(:record) { @record = zone.custom_hostnames.create(domain) }
|
8
|
+
|
9
|
+
let(:custom_origin) do
|
10
|
+
id = rand(1...100)
|
11
|
+
id += (job_id * 100) if job_id.positive?
|
12
|
+
subdomain = "origin-#{id}"
|
13
|
+
@dns_record = zone.dns_records.create("A", subdomain, "1.2.3.4") # This needs to exist or the calls will fail
|
14
|
+
"#{subdomain}.#{zone.name}"
|
15
|
+
end
|
16
|
+
|
17
|
+
after do
|
18
|
+
if defined? @record
|
19
|
+
expect(@record.delete).to be_success
|
20
|
+
end
|
21
|
+
|
22
|
+
if defined? @dns_record
|
23
|
+
expect(@dns_record.delete).to be_success
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'can create a custom hostname record' do
|
28
|
+
expect(record).to be_kind_of Cloudflare::CustomHostname
|
29
|
+
expect(record.custom_metadata).to be_nil
|
30
|
+
expect(record.hostname).to eq domain
|
31
|
+
expect(record.custom_origin).to be_nil
|
32
|
+
expect(record.ssl.method).to eq 'http'
|
33
|
+
expect(record.ssl.type).to eq 'dv'
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'can create a custom hostname record with a custom origin' do
|
37
|
+
begin
|
38
|
+
@record = zone.custom_hostnames.create(domain, origin: custom_origin)
|
39
|
+
|
40
|
+
expect(@record).to be_kind_of Cloudflare::CustomHostname
|
41
|
+
expect(@record.custom_metadata).to be_nil
|
42
|
+
expect(@record.hostname).to eq domain
|
43
|
+
expect(@record.custom_origin).to eq custom_origin
|
44
|
+
expect(@record.ssl.method).to eq 'http'
|
45
|
+
expect(@record.ssl.type).to eq 'dv'
|
46
|
+
rescue Cloudflare::RequestError => e
|
47
|
+
if e.message.include?('custom origin server has not been granted')
|
48
|
+
skip(e.message) # This currently doesn't work but might start eventually: https://github.com/socketry/async-rspec/issues/7
|
49
|
+
else
|
50
|
+
raise
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'can create a custom hostname record with different ssl options' do
|
56
|
+
@record = zone.custom_hostnames.create(domain, ssl: { method: 'cname' })
|
57
|
+
|
58
|
+
expect(@record).to be_kind_of Cloudflare::CustomHostname
|
59
|
+
expect(@record.custom_metadata).to be_nil
|
60
|
+
expect(@record.hostname).to eq domain
|
61
|
+
expect(@record.custom_origin).to be_nil
|
62
|
+
expect(@record.ssl.method).to eq 'cname'
|
63
|
+
expect(@record.ssl.type).to eq 'dv'
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'can create a custom hostname record with additional metadata' do
|
67
|
+
metadata = { a: rand(1..10) }
|
68
|
+
|
69
|
+
begin
|
70
|
+
@record = zone.custom_hostnames.create(domain, metadata: metadata)
|
71
|
+
|
72
|
+
expect(@record).to be_kind_of Cloudflare::CustomHostname
|
73
|
+
expect(@record.custom_metadata).to eq metadata
|
74
|
+
expect(@record.hostname).to eq domain
|
75
|
+
expect(@record.custom_origin).to be_nil
|
76
|
+
expect(@record.ssl.method).to eq 'http'
|
77
|
+
expect(@record.ssl.type).to eq 'dv'
|
78
|
+
rescue Cloudflare::RequestError => e
|
79
|
+
if e.message.include?('No custom metadata access has been allocated for this zone')
|
80
|
+
skip(e.message) # This currently doesn't work but might start eventually: https://github.com/socketry/async-rspec/issues/7
|
81
|
+
else
|
82
|
+
raise
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'can look up an existing custom hostname by the hostname or id' do
|
88
|
+
expect(zone.custom_hostnames.find_by_hostname(record.hostname).id).to eq record.id
|
89
|
+
expect(zone.custom_hostnames.find_by_id(record.id).id).to eq record.id
|
90
|
+
end
|
91
|
+
|
92
|
+
context 'with existing record' do
|
93
|
+
|
94
|
+
it 'returns the hostname when calling #to_s' do
|
95
|
+
expect(record.to_s).to eq domain
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'can update metadata' do
|
99
|
+
metadata = { c: rand(1..10) }
|
100
|
+
|
101
|
+
expect(record.custom_metadata).to be_nil
|
102
|
+
|
103
|
+
begin
|
104
|
+
record.update_settings(metadata: metadata)
|
105
|
+
|
106
|
+
# Make sure the existing object is updated
|
107
|
+
expect(record.custom_metadata).to eq metadata
|
108
|
+
|
109
|
+
# Verify that the server has the changes
|
110
|
+
found_record = zone.custom_hostnames.find_by_id(record.id)
|
111
|
+
|
112
|
+
expect(found_record.custom_metadata).to eq metadata
|
113
|
+
expect(found_record.hostname).to eq domain
|
114
|
+
expect(found_record.custom_origin).to be_nil
|
115
|
+
rescue Cloudflare::RequestError => e
|
116
|
+
if e.message.include?('No custom metadata access has been allocated for this zone')
|
117
|
+
skip(e.message) # This currently doesn't work but might start eventually: https://github.com/socketry/async-rspec/issues/7
|
118
|
+
else
|
119
|
+
raise
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
it 'can update the custom origin' do
|
125
|
+
expect(record.custom_origin).to be_nil
|
126
|
+
|
127
|
+
begin
|
128
|
+
record.update_settings(origin: custom_origin)
|
129
|
+
|
130
|
+
# Make sure the existing object is updated
|
131
|
+
expect(record.custom_origin).to eq custom_origin
|
132
|
+
|
133
|
+
# Verify that the server has the changes
|
134
|
+
found_record = zone.custom_hostnames.find_by_id(record.id)
|
135
|
+
|
136
|
+
expect(found_record.custom_metadata).to be_nil
|
137
|
+
expect(found_record.hostname).to eq domain
|
138
|
+
expect(found_record.custom_origin).to eq custom_origin
|
139
|
+
rescue Cloudflare::RequestError => e
|
140
|
+
if e.message.include?('custom origin server has not been granted')
|
141
|
+
skip(e.message) # This currently doesn't work but might start eventually: https://github.com/socketry/async-rspec/issues/7
|
142
|
+
else
|
143
|
+
raise
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
it 'can update ssl information' do
|
149
|
+
expect(record.ssl.method).to eq 'http'
|
150
|
+
|
151
|
+
record.update_settings(ssl: { method: 'cname', type: 'dv' })
|
152
|
+
|
153
|
+
# Make sure the existing object is updated
|
154
|
+
expect(record.ssl.method).to eq 'cname'
|
155
|
+
|
156
|
+
# Verify that the server has the changes
|
157
|
+
found_record = zone.custom_hostnames.find_by_id(record.id)
|
158
|
+
|
159
|
+
expect(found_record.custom_metadata).to be_nil
|
160
|
+
expect(found_record.hostname).to eq domain
|
161
|
+
expect(found_record.custom_origin).to be_nil
|
162
|
+
expect(found_record.ssl.method).to eq 'cname'
|
163
|
+
end
|
164
|
+
|
165
|
+
context 'has an ssl section' do
|
166
|
+
|
167
|
+
it 'wraps it in an SSLAttributes object' do
|
168
|
+
expect(record.ssl).to be_kind_of Cloudflare::CustomHostname::SSLAttribute
|
169
|
+
end
|
170
|
+
|
171
|
+
it 'has some helpers for commonly used keys' do
|
172
|
+
# Make sure our values exist before we check to make sure that they are returned correctly
|
173
|
+
expect(record.value[:ssl].values_at(:method, :http_body, :http_url).compact).not_to be_empty
|
174
|
+
expect(record.ssl.method).to be record.value[:ssl][:method]
|
175
|
+
expect(record.ssl.http_body).to be record.value[:ssl][:http_body]
|
176
|
+
expect(record.ssl.http_url).to be record.value[:ssl][:http_url]
|
177
|
+
end
|
178
|
+
|
179
|
+
end
|
180
|
+
|
181
|
+
describe '#ssl_active?' do
|
182
|
+
|
183
|
+
it 'returns the result of calling ssl.active?' do
|
184
|
+
expected_value = double
|
185
|
+
expect(record.ssl).to receive(:active?).and_return(expected_value)
|
186
|
+
expect(record).not_to receive(:send_patch)
|
187
|
+
expect(record.ssl_active?).to be expected_value
|
188
|
+
end
|
189
|
+
|
190
|
+
it 'returns the result of calling ssl.active? without triggering an update if force_update is true and the ssl is not in the pending_validation state' do
|
191
|
+
expected_value = double
|
192
|
+
expect(record.ssl).to receive(:active?).and_return(expected_value)
|
193
|
+
expect(record.ssl.method).not_to be_nil
|
194
|
+
expect(record.ssl.type).not_to be_nil
|
195
|
+
expect(record.ssl.pending_validation?).to be false
|
196
|
+
expect(record).not_to receive(:send_patch).with(ssl: { method: record.ssl.method, type: record.ssl.type })
|
197
|
+
expect(record.ssl_active?(true)).to be expected_value
|
198
|
+
end
|
199
|
+
|
200
|
+
it 'returns the result of calling ssl.active? after triggering an update if force_update is true and the ssl is in the pending_validation state' do
|
201
|
+
expected_value = double
|
202
|
+
expect(record.ssl).to receive(:active?).and_return(expected_value)
|
203
|
+
expect(record.ssl.method).not_to be_nil
|
204
|
+
expect(record.ssl.type).not_to be_nil
|
205
|
+
record.value[:ssl][:status] = 'pending_validation'
|
206
|
+
expect(record).to receive(:send_patch).with(ssl: { method: record.ssl.method, type: record.ssl.type })
|
207
|
+
expect(record.ssl_active?(true)).to be expected_value
|
208
|
+
end
|
209
|
+
|
210
|
+
end
|
211
|
+
|
212
|
+
end
|
213
|
+
end
|
data/spec/cloudflare/dns_spec.rb
CHANGED
@@ -6,21 +6,31 @@ RSpec.describe Cloudflare::DNS, order: :defined, timeout: 30 do
|
|
6
6
|
|
7
7
|
let(:subdomain) {"www#{ENV['TRAVIS_JOB_ID']}"}
|
8
8
|
|
9
|
-
let(:record) {@record = zone.dns_records.create("A", subdomain, "1.2.3.4")}
|
10
|
-
|
11
9
|
after do
|
12
10
|
if defined? @record
|
13
11
|
expect(@record.delete).to be_success
|
14
12
|
end
|
15
13
|
end
|
16
14
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
15
|
+
context "new record" do
|
16
|
+
it "can create dns record" do
|
17
|
+
@record = zone.dns_records.create("A", subdomain, "1.2.3.4")
|
18
|
+
expect(@record.type).to be == "A"
|
19
|
+
expect(@record.name).to be_start_with subdomain
|
20
|
+
expect(@record.content).to be == "1.2.3.4"
|
21
|
+
end
|
22
|
+
|
23
|
+
it "can create dns record with proxied option" do
|
24
|
+
@record = zone.dns_records.create("A", subdomain, "1.2.3.4", proxied: true)
|
25
|
+
expect(@record.type).to be == "A"
|
26
|
+
expect(@record.name).to be_start_with subdomain
|
27
|
+
expect(@record.content).to be == "1.2.3.4"
|
28
|
+
expect(@record.proxied).to be_truthy
|
29
|
+
end
|
21
30
|
end
|
22
31
|
|
23
32
|
context "with existing record" do
|
33
|
+
let(:record) {@record = zone.dns_records.create("A", subdomain, "1.2.3.4")}
|
24
34
|
it "can update dns content" do
|
25
35
|
record.update_content("4.3.2.1")
|
26
36
|
expect(record.content).to be == "4.3.2.1"
|
@@ -28,5 +38,13 @@ RSpec.describe Cloudflare::DNS, order: :defined, timeout: 30 do
|
|
28
38
|
fetched_record = zone.dns_records.find_by_name(record.name)
|
29
39
|
expect(fetched_record.content).to be == record.content
|
30
40
|
end
|
41
|
+
|
42
|
+
it "can update dns content with proxied option" do
|
43
|
+
record.update_content("4.3.2.1", proxied: true)
|
44
|
+
expect(record.proxied).to be_truthy
|
45
|
+
|
46
|
+
fetched_record = zone.dns_records.find_by_name(record.name)
|
47
|
+
expect(fetched_record.proxied).to be_truthy
|
48
|
+
end
|
31
49
|
end
|
32
50
|
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
|
2
|
+
RSpec.describe Cloudflare::KV::Namespaces, kv_spec: true, order: :defined, timeout: 30 do
|
3
|
+
include_context Cloudflare::Account
|
4
|
+
|
5
|
+
let(:namespace) { @namespace = account.kv_namespaces.create(namespace_title) }
|
6
|
+
let(:namespace_title) { "Test NS ##{rand(1..100)}" }
|
7
|
+
|
8
|
+
after do
|
9
|
+
if defined? @namespace
|
10
|
+
expect(@namespace.delete).to be_success
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'can create a namespace' do
|
15
|
+
expect(namespace).to be_kind_of Cloudflare::KV::Namespace
|
16
|
+
expect(namespace.id).not_to be_nil
|
17
|
+
expect(namespace.title).to eq namespace_title
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'can find a namespace by title' do
|
21
|
+
namespace # Call this so that the namespace gets created
|
22
|
+
expect(account.kv_namespaces.find_by_title(namespace_title).id).to eq namespace.id
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'can rename the namespace' do
|
26
|
+
new_title = "#{namespace_title}-#{rand(1..100)}"
|
27
|
+
namespace.rename(new_title)
|
28
|
+
expect(namespace.title).to eq new_title
|
29
|
+
expect(account.kv_namespaces.find_by_title(new_title).id).to eq namespace.id
|
30
|
+
expect(account.kv_namespaces.find_by_title(namespace_title)).to be_nil
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'can store a key/value, read it back' do
|
34
|
+
key = "key-#{rand(1..100)}"
|
35
|
+
value = rand(100..999)
|
36
|
+
namespace.write_value(key, value)
|
37
|
+
expect(account.kv_namespaces.find_by_id(namespace.id).read_value(key)).to eq value.to_s
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'can read a previously stored key' do
|
41
|
+
key = "key-#{rand(1..100)}"
|
42
|
+
value = rand(100..999)
|
43
|
+
expect(account.kv_namespaces.find_by_id(namespace.id).write_value(key, value)).to be true
|
44
|
+
expect(namespace.read_value(key)).to eq value.to_s
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'can delete keys' do
|
48
|
+
key = "key-#{rand(1..100)}"
|
49
|
+
value = rand(100..999)
|
50
|
+
expect(namespace.write_value(key, value)).to be true
|
51
|
+
expect(namespace.read_value(key)).to eq value.to_s
|
52
|
+
expect(namespace.delete_value(key)).to be true
|
53
|
+
expect do
|
54
|
+
account.kv_namespaces.find_by_id(namespace.id).read_value(key)
|
55
|
+
end.to raise_error(Cloudflare::RequestError)
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'can get the keys that exist in the namespace' do
|
59
|
+
counter = 0
|
60
|
+
keys = Array.new(rand(1..9)) { "key-#{counter += 1}" } # Keep this single digits so ordering works
|
61
|
+
keys.each_with_index do |key, i|
|
62
|
+
namespace.write_value(key, i)
|
63
|
+
end
|
64
|
+
|
65
|
+
saved_keys = account.kv_namespaces.find_by_id(namespace.id).keys.to_a
|
66
|
+
expect(saved_keys.length).to eq keys.length
|
67
|
+
saved_keys.each_with_index do |key, i|
|
68
|
+
expect(key.name).to eq keys[i]
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|