rspec-dns 0.1.2 → 0.1.3
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 +8 -8
- data/README.md +18 -9
- data/lib/rspec-dns.rb +1 -0
- data/lib/rspec-dns/have_dns.rb +9 -1
- data/rspec-dns.gemspec +2 -2
- data/spec/rspec-dns/have_dns_spec.rb +48 -40
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
YWZhYzZhZTc5ZjFiZWY2MzRhMjIwMWMyYzhhNjQ2N2M3YWQxYWEyZg==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
YTNiNTQyZWU5ZTBmM2ZhYTMzMmI4MjFhMjAyNGFmMWFhYWE3ZGQ0MQ==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
ZTAyZWQ5NGM5YWRhNmI3YzIxOWNiZGUxMzcxNWE5ZTI1ZjY1YjVkYjY5YjI2
|
10
|
+
YjBhMTEzMWQ2OGEzYWYxYTE4MGJjOTFlYzRiNWQ0ZjJkODcyZmUzZmNhZjgw
|
11
|
+
YWFiZWE1MzQzMTk0Mzk0OTMyZDk3ZjcyOTI4YmZlNjJkNjYwN2I=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
NmEzYmE0ZjdiYmJhODJlZjllYjhjMjVkZGQ3MjMxZDc0Njc1NDE5ZjAxZjZj
|
14
|
+
YTdiNDE3ZjQzMTQxZjc1ODhlMjZlZTgzMTQyNTZjNTY1Y2M1M2NmYTE4ZTJm
|
15
|
+
MDIwZTIzOTRmZWUxNzE0ZmYyNzY0YjA5ZDg2ZGJkZjA1Y2YyZDE=
|
data/README.md
CHANGED
@@ -35,7 +35,7 @@ Then, create a spec like this:
|
|
35
35
|
require 'spec_helper'
|
36
36
|
|
37
37
|
describe 'www.example.com' do
|
38
|
-
it {
|
38
|
+
it { is_expected.to have_dns.with_type('TXT').and_ttl(300).and_data('a=b') }
|
39
39
|
end
|
40
40
|
```
|
41
41
|
|
@@ -46,8 +46,9 @@ require 'spec_helper'
|
|
46
46
|
|
47
47
|
describe 'DNS tests' do
|
48
48
|
it 'passes some tests' do
|
49
|
-
'www.example.com'.
|
50
|
-
'www.example.com'.
|
49
|
+
expect('www.example.com').to have_dns.with_type('TXT').and_ttl(300).and_data('a=b')
|
50
|
+
expect('www.example.com').to have_dns.with_type('A').and_ttl(300).and_address('192.0.2.4')
|
51
|
+
expect('192.0.2.4').to have_dns.with_type('PTR').and_domainname('www.example.com')
|
51
52
|
end
|
52
53
|
end
|
53
54
|
```
|
@@ -59,20 +60,25 @@ Currently the following chaining methods are supported:
|
|
59
60
|
- at\_least
|
60
61
|
- in\_authority
|
61
62
|
- refuse\_request
|
63
|
+
- config
|
62
64
|
|
63
65
|
Here's some usage examples:
|
64
66
|
|
65
67
|
```ruby
|
66
68
|
it 'checks if recursion is disabled' do
|
67
|
-
'google.com'.
|
69
|
+
expect('google.com').to have_dns.refuse_request
|
68
70
|
end
|
69
71
|
|
70
72
|
it 'checks if gslb subdomain is delegated to dynect' do
|
71
|
-
'gslb.example.com'.
|
73
|
+
expect('gslb.example.com').to have_dns.in_authority.with_type('NS').and_name(/dynect/).at_least(3)
|
72
74
|
end
|
73
75
|
|
74
76
|
it 'checks number of hosts in round robin' do
|
75
|
-
'example.com'.
|
77
|
+
expect('example.com').to have_dns.with_type('A').at_least(3)
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'check with configuration' do
|
81
|
+
expect('example.com').to have_dns.with_type('A').config(nameserver: '192.0.2.4')
|
76
82
|
end
|
77
83
|
```
|
78
84
|
|
@@ -109,7 +115,7 @@ Depending on the type of record, the following attributes may be available:
|
|
109
115
|
If you try checking an attribute on a record that is non-existent (like checking the `rmailbx` on an `A` record), you'll get an error like this:
|
110
116
|
|
111
117
|
```text
|
112
|
-
Failure/Error: it {
|
118
|
+
Failure/Error: it { is_expected.to have_dns.with_type('TXT').and_ftl(300).and_data('a=b') }
|
113
119
|
got 1 exception(s): undefined method `rmailbx' for #<Dnsruby::RR::IN::A:0x007f66a0339b00>
|
114
120
|
```
|
115
121
|
|
@@ -117,7 +123,7 @@ For this reason, you should always check the `type` attribute first in your chai
|
|
117
123
|
|
118
124
|
Configuring
|
119
125
|
-----------
|
120
|
-
All configurations
|
126
|
+
All configurations can be in your project root at `config/dns.yml`. This YAML file directly corresponds to the Resolv DNS initializer.
|
121
127
|
|
122
128
|
For example, to directly query your DNS servers (necessary for correct TTL tests), create a `config/dns.yml` file like this:
|
123
129
|
|
@@ -128,8 +134,9 @@ nameserver:
|
|
128
134
|
```
|
129
135
|
|
130
136
|
If this file is missing Resolv will use the settings in /etc/resolv.conf.
|
137
|
+
You can also configure with `config` chain.
|
131
138
|
|
132
|
-
The full list of configuration options can be found on the [Dnsruby docs](http://
|
139
|
+
The full list of configuration options can be found on the [Dnsruby docs](http://www.ruby-doc.org/gems/docs/d/Dnsruby-1.0/Dnsruby/Config.html).
|
133
140
|
|
134
141
|
### Configuring connection timeout
|
135
142
|
|
@@ -161,11 +168,13 @@ License & Authors
|
|
161
168
|
- Seth Vargo (sethvargo@gmail.com)
|
162
169
|
- Johannes Russek (jrussek@spotify.com)
|
163
170
|
- Alexey Lapitsky (lex@realisticgroup.com)
|
171
|
+
- Hiroshi OTA (otahi.pub@gmail.com)
|
164
172
|
|
165
173
|
```text
|
166
174
|
Copyright 2012-2013 Seth Vargo
|
167
175
|
Copyright 2012-2013 CustomInk, LLC
|
168
176
|
Copyright 2013-2014 Spotify AB
|
177
|
+
Copyright 2013-2014 Hiroshi OTA
|
169
178
|
|
170
179
|
Licensed under the Apache License, Version 2.0 (the "License");
|
171
180
|
you may not use this file except in compliance with the License.
|
data/lib/rspec-dns.rb
CHANGED
data/lib/rspec-dns/have_dns.rb
CHANGED
@@ -80,6 +80,10 @@ RSpec::Matchers.define :have_dns do
|
|
80
80
|
@refuse_request = true
|
81
81
|
end
|
82
82
|
|
83
|
+
chain :config do |c|
|
84
|
+
@config = c
|
85
|
+
end
|
86
|
+
|
83
87
|
def method_missing(m, *args, &block)
|
84
88
|
if m.to_s =~ /(and\_with|and|with)?\_(.*)$/
|
85
89
|
_options[$2.to_sym] = args.first
|
@@ -129,7 +133,11 @@ RSpec::Matchers.define :have_dns do
|
|
129
133
|
Timeout::timeout(query_timeout + 0.2) do
|
130
134
|
resolver = Dnsruby::Resolver.new(config)
|
131
135
|
resolver.query_timeout = query_timeout
|
132
|
-
|
136
|
+
if (IPAddr.new(@dns) rescue nil) # Check if IPAddr(v4,v6)
|
137
|
+
resolver.query(@dns, Dnsruby::Types.PTR)
|
138
|
+
else
|
139
|
+
resolver.query(@dns, Dnsruby::Types.ANY)
|
140
|
+
end
|
133
141
|
end
|
134
142
|
rescue Exception => e
|
135
143
|
if Dnsruby::NXDomain === e
|
data/rspec-dns.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
|
-
s.version = '0.1.
|
2
|
+
s.version = '0.1.3'
|
3
3
|
s.name = 'rspec-dns'
|
4
|
-
s.authors = ['Seth Vargo', 'Alexey Lapitsky', 'Johannes Russek']
|
4
|
+
s.authors = ['Seth Vargo', 'Alexey Lapitsky', 'Johannes Russek', 'Hiroshi OTA']
|
5
5
|
s.email = 'alexey@spotify.com'
|
6
6
|
s.description = 'Easily test your DNS entries with RSpec'
|
7
7
|
s.summary = 'rspec-dns provides an easy-to-use DSL for testing your DNS records are responding as they should.'
|
@@ -3,11 +3,11 @@ require 'spec_helper'
|
|
3
3
|
def stub_records(strings)
|
4
4
|
records = strings.map { |s| Dnsruby::RR.new_from_string(s) }
|
5
5
|
resolver = Dnsruby::Resolver.new
|
6
|
-
Dnsruby::Resolver.
|
6
|
+
allow(Dnsruby::Resolver).to receive(:new) do
|
7
7
|
yield if block_given?
|
8
8
|
resolver
|
9
9
|
end
|
10
|
-
resolver.
|
10
|
+
allow(resolver).to receive_message_chain(:query, :answer).and_return(records)
|
11
11
|
end
|
12
12
|
|
13
13
|
describe 'rspec-dns matchers' do
|
@@ -15,68 +15,68 @@ describe 'rspec-dns matchers' do
|
|
15
15
|
describe '#have_dns' do
|
16
16
|
context 'with a sigle record' do
|
17
17
|
it 'can evalutate an A record' do
|
18
|
-
stub_records(['example.com 86400 A 192.
|
18
|
+
stub_records(['example.com 86400 A 192.0.2.4'])
|
19
19
|
|
20
|
-
'example.com'.
|
21
|
-
'example.com'.
|
22
|
-
'example.com'.
|
20
|
+
expect('example.com').to have_dns.with_type('A')
|
21
|
+
expect('example.com').to_not have_dns.with_type('TXT')
|
22
|
+
expect('example.com').to have_dns.with_type('A').and_address('192.0.2.4')
|
23
23
|
end
|
24
24
|
|
25
25
|
it 'can evalutate a AAAA record' do
|
26
|
-
stub_records(['example.com 86400 AAAA 2001:
|
26
|
+
stub_records(['example.com 86400 AAAA 2001:DB8:6c::430'])
|
27
27
|
|
28
|
-
'example.com'.
|
29
|
-
'example.com'.
|
30
|
-
'example.com'.
|
31
|
-
.and_address('2001:
|
28
|
+
expect('example.com').to have_dns.with_type('AAAA')
|
29
|
+
expect('example.com').to_not have_dns.with_type('A')
|
30
|
+
expect('example.com').to have_dns.with_type('AAAA')
|
31
|
+
.and_address('2001:DB8:6C::430')
|
32
32
|
end
|
33
33
|
|
34
34
|
it 'can evalutate a CNAME record' do
|
35
35
|
stub_records(['www.example.com 300 IN CNAME example.com'])
|
36
36
|
|
37
|
-
'example.com'.
|
38
|
-
'example.com'.
|
39
|
-
'example.com'.
|
37
|
+
expect('example.com').to have_dns.with_type('CNAME')
|
38
|
+
expect('example.com').to_not have_dns.with_type('AAAA')
|
39
|
+
expect('example.com').to have_dns.with_type('CNAME').and_name('www.example.com')
|
40
40
|
end
|
41
41
|
|
42
42
|
it 'can evalutate an MX record' do
|
43
43
|
stub_records(['example.com. 7200 MX 40 mail.example.com.'])
|
44
44
|
|
45
|
-
'example.com'.
|
46
|
-
'example.com'.
|
47
|
-
'example.com'.
|
48
|
-
'example.com'.
|
45
|
+
expect('example.com').to have_dns.with_type('MX')
|
46
|
+
expect('example.com').to_not have_dns.with_type('CNAME')
|
47
|
+
expect('example.com').to have_dns.with_type('MX').and_preference(40)
|
48
|
+
expect('example.com').to have_dns.with_type('MX')
|
49
49
|
.and_preference(40).and_exchange('mail.example.com')
|
50
|
-
'example.com'.
|
50
|
+
expect('example.com').to_not have_dns.with_type('MX')
|
51
51
|
.and_preference(30).and_exchange('mail.example.com')
|
52
|
-
'example.com'.
|
52
|
+
expect('example.com').to_not have_dns.with_type('MX')
|
53
53
|
.and_preference(40).and_exchange('example.com')
|
54
54
|
end
|
55
55
|
|
56
56
|
it 'can evalutate an NS record' do
|
57
57
|
stub_records(['sub.example.com. 300 IN NS ns.sub.example.com.'])
|
58
58
|
|
59
|
-
'example.com'.
|
60
|
-
'example.com'.
|
61
|
-
'example.com'.
|
62
|
-
'example.com'.
|
59
|
+
expect('example.com').to have_dns.with_type('NS')
|
60
|
+
expect('example.com').to_not have_dns.with_type('MX')
|
61
|
+
expect('example.com').to have_dns.with_type('NS').and_domainname('ns.sub.example.com')
|
62
|
+
expect('example.com').to_not have_dns.with_type('NS').and_domainname('sub.example.com')
|
63
63
|
end
|
64
64
|
|
65
65
|
it 'can evalutate a PTR record' do
|
66
66
|
stub_records(['ptrs.example.com. 300 IN PTR ptr.example.com.'])
|
67
67
|
|
68
|
-
'192.168.100.100'.
|
69
|
-
'192.168.100.100'.
|
70
|
-
'192.168.100.100'.
|
71
|
-
'192.168.100.100'.
|
68
|
+
expect('192.168.100.100').to have_dns.with_type('PTR')
|
69
|
+
expect('192.168.100.100').to_not have_dns.with_type('MX')
|
70
|
+
expect('192.168.100.100').to have_dns.with_type('PTR').and_domainname('ptr.example.com')
|
71
|
+
expect('192.168.100.100').to_not have_dns.with_type('PTR').and_domainname('ptrs.example.com')
|
72
72
|
end
|
73
73
|
|
74
74
|
it 'can evalutate an SOA record' do
|
75
75
|
stub_records(['example.com 210 IN SOA ns.example.com a.example.com. 2014030712 60 25 3628800 900'])
|
76
76
|
|
77
|
-
'example.com'.
|
78
|
-
'example.com'.
|
79
|
-
'example.com'.
|
77
|
+
expect('example.com').to have_dns.with_type('SOA')
|
78
|
+
expect('example.com').to_not have_dns.with_type('PTR')
|
79
|
+
expect('example.com').to have_dns.with_type('SOA')
|
80
80
|
.and_mname('ns.example.com')
|
81
81
|
.and_rname('a.example.com')
|
82
82
|
.and_serial('2014030712')
|
@@ -84,34 +84,42 @@ describe 'rspec-dns matchers' do
|
|
84
84
|
.and_retry(25)
|
85
85
|
.and_expire(3628800)
|
86
86
|
.and_minimum(900)
|
87
|
-
'example.com'.
|
87
|
+
expect('example.com').to_not have_dns.with_type('SOA')
|
88
88
|
.and_mname('nstest.example.com')
|
89
89
|
end
|
90
90
|
|
91
91
|
it 'can evalutate a TXT record' do
|
92
92
|
stub_records(['example.com. 300 IN TXT "v=spf1 a:example.com ~all"'])
|
93
93
|
|
94
|
-
'example.com'.
|
95
|
-
'example.com'.
|
96
|
-
'example.com'.
|
97
|
-
'example.com'.
|
94
|
+
expect('example.com').to have_dns.with_type('TXT')
|
95
|
+
expect('example.com').to_not have_dns.with_type('SOA')
|
96
|
+
expect('example.com').to have_dns.with_type('TXT').and_data('v=spf1 a:example.com ~all')
|
97
|
+
expect('example.com').to_not have_dns.with_type('TXT').and_data('v=spf2 a:example.com ~all')
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
context 'with config chain' do
|
102
|
+
it 'should accept config chain' do
|
103
|
+
stub_records(['example.com 86400 A 192.0.2.1'])
|
104
|
+
expect('example.com').to have_dns.with_type('A')
|
105
|
+
.config(nameserver: '192.0.2.4')
|
98
106
|
end
|
99
107
|
end
|
100
108
|
|
101
109
|
context 'with changable connection timeout' do
|
102
|
-
it '
|
110
|
+
it 'is_expected.to timeout within 3 seconds in default' do
|
103
111
|
stub_records(['example.com 86400 A 192.168.100.100']) do
|
104
112
|
sleep 3
|
105
113
|
end
|
106
|
-
'example.com'.
|
114
|
+
expect('example.com').to_not have_dns.with_type('A')
|
107
115
|
end
|
108
116
|
|
109
|
-
it '
|
117
|
+
it 'is_expected.to not timeout within 3 seconds when timeout is 5' do
|
110
118
|
RSpec.configuration.rspec_dns_connection_timeout = 5
|
111
119
|
stub_records(['example.com 86400 A 192.168.100.100']) do
|
112
120
|
sleep 3
|
113
121
|
end
|
114
|
-
'example.com'.
|
122
|
+
expect('example.com').to have_dns.with_type('A')
|
115
123
|
end
|
116
124
|
end
|
117
125
|
end
|
metadata
CHANGED
@@ -1,16 +1,17 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rspec-dns
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Seth Vargo
|
8
8
|
- Alexey Lapitsky
|
9
9
|
- Johannes Russek
|
10
|
+
- Hiroshi OTA
|
10
11
|
autorequire:
|
11
12
|
bindir: bin
|
12
13
|
cert_chain: []
|
13
|
-
date: 2014-
|
14
|
+
date: 2014-10-19 00:00:00.000000000 Z
|
14
15
|
dependencies:
|
15
16
|
- !ruby/object:Gem::Dependency
|
16
17
|
name: rake
|
@@ -92,7 +93,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
92
93
|
version: '0'
|
93
94
|
requirements: []
|
94
95
|
rubyforge_project:
|
95
|
-
rubygems_version: 2.0.
|
96
|
+
rubygems_version: 2.0.14
|
96
97
|
signing_key:
|
97
98
|
specification_version: 4
|
98
99
|
summary: rspec-dns provides an easy-to-use DSL for testing your DNS records are responding
|