cloudflare 4.0.1 → 4.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|