Skip to content

Commit 819726d

Browse files
authored
Feature/RSpec integration (#27)
* Added DnsMock::TestFramework::RSpec::Interface, tests * Added DnsMock::TestFramework::RSpec::Helper, tests * Added RSpec DnsMock config * Updated gem version, documentation, changelog
1 parent 130779a commit 819726d

File tree

12 files changed

+296
-2
lines changed

12 files changed

+296
-2
lines changed

.reek.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ detectors:
2121
- DnsMock::ServerHelper#start_random_server
2222
- DnsMock::ServerHelper#stop_all_running_servers
2323
- DnsMock::Server::RecordsDictionaryBuilder#rdns_lookup_prefix
24+
- DnsMock::ContextGeneratorHelper#random_port_number
25+
- DnsMock::TestFramework::RSpec::Helper#dns_mock_server
2426

2527
ControlParameter:
2628
exclude:

CHANGELOG.md

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,40 @@
22

33
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
44

5+
## [1.1.0] - 2021-02-01
6+
7+
### RSpec native support
8+
9+
Added DnsMock helper which can simplify integration with RSpec.
10+
11+
```ruby
12+
# spec/support/config/dns_mock.rb
13+
require 'dns_mock/test_framework/rspec'
14+
15+
RSpec.configure do |config|
16+
config.include DnsMock::TestFramework::RSpec::Helper
17+
end
18+
19+
# your awesome first_a_record_spec.rb
20+
RSpec.describe FirstARecord do
21+
subject(:service) do
22+
described_class.call(
23+
hostname,
24+
dns_gateway_host: 'localhost',
25+
dns_gateway_port: dns_mock_server.port
26+
)
27+
end
28+
29+
let(:hostname) { 'example.com' }
30+
let(:first_a_record) { '1.2.3.4' }
31+
let(:records) { { hostname => { a: [first_a_record] } } }
32+
33+
before { dns_mock_server.assign_mocks(records) }
34+
35+
it { is_expected.to eq(first_a_record) }
36+
end
37+
```
38+
539
## [1.0.0] - 2021-01-29
640

741
### Configurable record not found behaviour

Gemfile.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
PATH
22
remote: .
33
specs:
4-
dns_mock (1.0.0)
4+
dns_mock (1.1.0)
55

66
GEM
77
remote: https://rubygems.org/

README.md

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
- [Requirements](#requirements)
1717
- [Installation](#installation)
1818
- [Usage](#usage)
19+
- [RSpec](#rspec)
1920
- [Contributing](#contributing)
2021
- [License](#license)
2122
- [Code of Conduct](#code-of-conduct)
@@ -110,6 +111,68 @@ DnsMock.running_servers # => [DnsMock::Server instance]
110111
DnsMock.stop_running_servers! # => true
111112
```
112113

114+
### RSpec
115+
116+
Require this either in your Gemfile or in RSpec's support scripts. So either:
117+
118+
```ruby
119+
# Gemfile
120+
group :test do
121+
gem 'rspec'
122+
gem 'dns_mock', require: 'dns_mock/test_framework/rspec'
123+
end
124+
```
125+
126+
or
127+
128+
```ruby
129+
# spec/support/config/dns_mock.rb
130+
require 'dns_mock/test_framework/rspec'
131+
```
132+
133+
#### DnsMock RSpec helper
134+
135+
Just add `DnsMock::TestFramework::RSpec::Helper` if you wanna have shortcut for DnsMock server instance into your RSpec.describe blocks:
136+
137+
```ruby
138+
# spec/support/config/dns_mock.rb
139+
RSpec.configure do |config|
140+
config.include DnsMock::TestFramework::RSpec::Helper
141+
end
142+
```
143+
144+
```ruby
145+
# your awesome first_a_record_spec.rb
146+
RSpec.describe FirstARecord do
147+
subject(:service) do
148+
described_class.call(
149+
hostname,
150+
dns_gateway_host: 'localhost',
151+
dns_gateway_port: dns_mock_server.port
152+
)
153+
end
154+
155+
let(:hostname) { 'example.com' }
156+
let(:first_a_record) { '1.2.3.4' }
157+
let(:records) { { hostname => { a: [first_a_record] } } }
158+
159+
before { dns_mock_server.assign_mocks(records) }
160+
161+
it { is_expected.to eq(first_a_record) }
162+
end
163+
```
164+
165+
#### DnsMock RSpec interface
166+
167+
If you won't use `DnsMock::TestFramework::RSpec::Helper` you can use `DnsMock::TestFramework::RSpec::Interface` directly instead:
168+
169+
```ruby
170+
DnsMock::TestFramework::RSpec::Interface.start_server # creates and runs DnsMock server instance
171+
DnsMock::TestFramework::RSpec::Interface.stop_server! # stops current DnsMock server instance
172+
DnsMock::TestFramework::RSpec::Interface.reset_mocks! # resets mocks in current DnsMock server instance
173+
DnsMock::TestFramework::RSpec::Interface.clear_server! # stops and clears current DnsMock server instance
174+
```
175+
113176
## Contributing
114177

115178
Bug reports and pull requests are welcome on GitHub at https://github.com/mocktools/ruby-dns-mock. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct. Please check the [open tikets](https://github.com/mocktools/ruby-dns-mock/issues). Be shure to follow Contributor Code of Conduct below and our [Contributing Guidelines](CONTRIBUTING.md).
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# frozen_string_literal: true
2+
3+
require 'rspec/core'
4+
require_relative '../../dns_mock'
5+
require_relative './rspec/interface'
6+
require_relative './rspec/helper'
7+
8+
RSpec.configure do |config|
9+
config.before(:suite) { DnsMock::TestFramework::RSpec::Interface.start_server }
10+
config.after(:suite) { DnsMock::TestFramework::RSpec::Interface.stop_server! }
11+
config.after { DnsMock::TestFramework::RSpec::Interface.reset_mocks! }
12+
end
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# frozen_string_literal: true
2+
3+
require_relative './interface'
4+
5+
module DnsMock
6+
module TestFramework
7+
module RSpec
8+
module Helper
9+
def dns_mock_server(**options)
10+
DnsMock::TestFramework::RSpec::Interface.start_server(**options)
11+
end
12+
end
13+
end
14+
end
15+
end
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# frozen_string_literal: true
2+
3+
module DnsMock
4+
module TestFramework
5+
module RSpec
6+
module Interface
7+
class << self
8+
def start_server(**options)
9+
@dns_mock_server ||= DnsMock.start_server(**options) # rubocop:disable Naming/MemoizedInstanceVariableName
10+
end
11+
12+
def stop_server!
13+
return unless dns_mock_server
14+
15+
dns_mock_server.stop!
16+
end
17+
18+
def reset_mocks!
19+
return unless dns_mock_server
20+
21+
dns_mock_server.reset_mocks!
22+
end
23+
24+
def clear_server!
25+
@dns_mock_server = nil
26+
end
27+
28+
private
29+
30+
attr_reader :dns_mock_server
31+
end
32+
end
33+
end
34+
end
35+
end

lib/dns_mock/version.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# frozen_string_literal: true
22

33
module DnsMock
4-
VERSION = '1.0.0'
4+
VERSION = '1.1.0'
55
end
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
# frozen_string_literal: true
2+
3+
require_relative '../../../../lib/dns_mock/test_framework/rspec/helper'
4+
5+
class TestClass
6+
include DnsMock::TestFramework::RSpec::Helper
7+
end
8+
9+
RSpec.describe DnsMock::TestFramework::RSpec::Helper do
10+
let(:test_class_instance) { TestClass.new }
11+
12+
describe '.dns_mock_server' do
13+
let(:dns_mock_server_instance) { instance_double('DnsMockServerInstance') }
14+
15+
context 'with kwargs' do
16+
subject(:helper) { test_class_instance.dns_mock_server(**options) }
17+
18+
let(:records) { random_records }
19+
let(:port) { random_port_number }
20+
let(:options) { { records: records, port: port } }
21+
22+
it do
23+
expect(DnsMock::TestFramework::RSpec::Interface)
24+
.to receive(:start_server)
25+
.with(**options)
26+
.and_return(dns_mock_server_instance)
27+
expect(helper).to eq(dns_mock_server_instance)
28+
end
29+
end
30+
31+
context 'without kwargs' do
32+
subject(:helper) { test_class_instance.dns_mock_server }
33+
34+
it do
35+
expect(DnsMock::TestFramework::RSpec::Interface)
36+
.to receive(:start_server)
37+
.and_return(dns_mock_server_instance)
38+
expect(helper).to eq(dns_mock_server_instance)
39+
end
40+
end
41+
end
42+
end
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
# frozen_string_literal: true
2+
3+
require_relative '../../../../lib/dns_mock/test_framework/rspec/interface'
4+
5+
RSpec.describe DnsMock::TestFramework::RSpec::Interface do
6+
after { described_class.clear_server! }
7+
8+
describe '.start_server' do
9+
let(:dns_mock_server_instance) { instance_double('DnsMockServerInstance') }
10+
11+
context 'with kwargs' do
12+
subject(:start_server) { described_class.start_server(**options) }
13+
14+
let(:records) { random_records }
15+
let(:port) { random_port_number }
16+
let(:options) { { records: records, port: port } }
17+
18+
it do
19+
expect(DnsMock).to receive(:start_server).with(**options).and_return(dns_mock_server_instance)
20+
expect(start_server).to eq(dns_mock_server_instance)
21+
end
22+
end
23+
24+
context 'without kwargs' do
25+
subject(:start_server) { described_class.start_server }
26+
27+
it do
28+
expect(DnsMock).to receive(:start_server).and_return(dns_mock_server_instance)
29+
expect(start_server).to eq(dns_mock_server_instance)
30+
end
31+
end
32+
end
33+
34+
describe '.stop_server!' do
35+
subject(:stop_server) { described_class.stop_server! }
36+
37+
context 'when dns mock server exists' do
38+
before { described_class.start_server }
39+
40+
after { stop_all_running_servers }
41+
42+
it { is_expected.to be(true) }
43+
end
44+
45+
context 'when dns mock server not exists' do
46+
it { is_expected.to be_nil }
47+
end
48+
end
49+
50+
describe '.reset_mocks!' do
51+
subject(:stop_server) { described_class.reset_mocks! }
52+
53+
context 'when dns mock server exists' do
54+
before { described_class.start_server }
55+
56+
after { stop_all_running_servers }
57+
58+
it { is_expected.to be(true) }
59+
end
60+
61+
context 'when dns mock server not exists' do
62+
it { is_expected.to be_nil }
63+
end
64+
end
65+
66+
describe 'clear_server!' do
67+
subject(:clear_server) { described_class.clear_server! }
68+
69+
it { is_expected.to be_nil }
70+
end
71+
end

0 commit comments

Comments
 (0)