super8 0.2.1
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 +7 -0
- data/LICENSE +21 -0
- data/README.md +96 -0
- data/lib/super8/cassette.rb +119 -0
- data/lib/super8/config.rb +12 -0
- data/lib/super8/diff_helper.rb +39 -0
- data/lib/super8/errors.rb +10 -0
- data/lib/super8/playback_database_wrapper.rb +57 -0
- data/lib/super8/playback_statement_wrapper.rb +80 -0
- data/lib/super8/recording_database_wrapper.rb +37 -0
- data/lib/super8/recording_statement_wrapper.rb +64 -0
- data/lib/super8/version.rb +5 -0
- data/lib/super8.rb +100 -0
- data/spec/spec_helper.rb +22 -0
- data/spec/super8/cassette_spec.rb +76 -0
- data/spec/super8/config_spec.rb +27 -0
- data/spec/super8/odbc_interception_spec.rb +534 -0
- data/spec/super8/playback_spec.rb +127 -0
- data/spec/super8_spec.rb +35 -0
- metadata +146 -0
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "spec_helper"
|
|
4
|
+
require "super8"
|
|
5
|
+
require "fakefs/spec_helpers"
|
|
6
|
+
|
|
7
|
+
RSpec.describe "Playback mode with diff output" do
|
|
8
|
+
include FakeFS::SpecHelpers
|
|
9
|
+
|
|
10
|
+
let(:cassette_name) { "test_cassette" }
|
|
11
|
+
let(:cassette_dir) { "/tmp/super8_cassettes" }
|
|
12
|
+
|
|
13
|
+
before do
|
|
14
|
+
Super8.configure { |c| c.cassette_directory = cassette_dir }
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
describe "SQL query mismatch" do
|
|
18
|
+
it "shows detailed diff for single-line query mismatch" do
|
|
19
|
+
# Create a cassette with a recorded query
|
|
20
|
+
cassette_path = File.join(cassette_dir, cassette_name)
|
|
21
|
+
FileUtils.mkdir_p(cassette_path)
|
|
22
|
+
|
|
23
|
+
# Write a commands file with a recorded query
|
|
24
|
+
commands = [
|
|
25
|
+
{
|
|
26
|
+
"connection_id" => 1,
|
|
27
|
+
"method" => "run",
|
|
28
|
+
"sql" => "SELECT * FROM users WHERE id = ?",
|
|
29
|
+
"params" => [123],
|
|
30
|
+
"statement_id" => 1
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
File.write(File.join(cassette_path, "commands.yml"), YAML.dump(commands))
|
|
34
|
+
|
|
35
|
+
# Try to replay with a different query
|
|
36
|
+
cassette_loaded = Super8::Cassette.new(cassette_name)
|
|
37
|
+
cassette_loaded.load
|
|
38
|
+
|
|
39
|
+
wrapper = Super8::PlaybackDatabaseWrapper.new(cassette_loaded, 1)
|
|
40
|
+
|
|
41
|
+
expect {
|
|
42
|
+
wrapper.run("SELECT * FROM customers WHERE id = ?", 123)
|
|
43
|
+
}.to raise_error(Super8::CommandMismatchError) do |error|
|
|
44
|
+
expect(error.message).to include("sql mismatch:")
|
|
45
|
+
expect(error.message).to include("- SELECT * FROM users WHERE id = ?")
|
|
46
|
+
expect(error.message).to include("+ SELECT * FROM customers WHERE id = ?")
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it "shows detailed diff for multi-line query mismatch" do
|
|
51
|
+
# Create a cassette with a multi-line recorded query
|
|
52
|
+
cassette_path = File.join(cassette_dir, cassette_name)
|
|
53
|
+
FileUtils.mkdir_p(cassette_path)
|
|
54
|
+
|
|
55
|
+
expected_sql = <<~SQL
|
|
56
|
+
SELECT id, name, email
|
|
57
|
+
FROM users
|
|
58
|
+
WHERE status = 'active'
|
|
59
|
+
ORDER BY created_at DESC
|
|
60
|
+
SQL
|
|
61
|
+
|
|
62
|
+
actual_sql = <<~SQL
|
|
63
|
+
SELECT id, username, email
|
|
64
|
+
FROM customers
|
|
65
|
+
WHERE status = 'active'
|
|
66
|
+
ORDER BY created_at ASC
|
|
67
|
+
SQL
|
|
68
|
+
|
|
69
|
+
commands = [
|
|
70
|
+
{
|
|
71
|
+
"connection_id" => 1,
|
|
72
|
+
"method" => "run",
|
|
73
|
+
"sql" => expected_sql,
|
|
74
|
+
"params" => [],
|
|
75
|
+
"statement_id" => 1
|
|
76
|
+
}
|
|
77
|
+
]
|
|
78
|
+
File.write(File.join(cassette_path, "commands.yml"), YAML.dump(commands))
|
|
79
|
+
|
|
80
|
+
# Try to replay with a different query
|
|
81
|
+
cassette_loaded = Super8::Cassette.new(cassette_name)
|
|
82
|
+
cassette_loaded.load
|
|
83
|
+
|
|
84
|
+
wrapper = Super8::PlaybackDatabaseWrapper.new(cassette_loaded, 1)
|
|
85
|
+
|
|
86
|
+
expect {
|
|
87
|
+
wrapper.run(actual_sql)
|
|
88
|
+
}.to raise_error(Super8::CommandMismatchError) do |error|
|
|
89
|
+
expect(error.message).to include("sql mismatch:")
|
|
90
|
+
expect(error.message).to include("- SELECT id, name, email")
|
|
91
|
+
expect(error.message).to include("+ SELECT id, username, email")
|
|
92
|
+
expect(error.message).to include("- FROM users")
|
|
93
|
+
expect(error.message).to include("+ FROM customers")
|
|
94
|
+
expect(error.message).to include("WHERE status = 'active'")
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
it "shows regular output for non-SQL mismatches" do
|
|
99
|
+
# Create a cassette with a recorded query
|
|
100
|
+
cassette_path = File.join(cassette_dir, cassette_name)
|
|
101
|
+
FileUtils.mkdir_p(cassette_path)
|
|
102
|
+
|
|
103
|
+
commands = [
|
|
104
|
+
{
|
|
105
|
+
"connection_id" => 1,
|
|
106
|
+
"method" => "run",
|
|
107
|
+
"sql" => "SELECT * FROM users",
|
|
108
|
+
"params" => [123],
|
|
109
|
+
"statement_id" => 1
|
|
110
|
+
}
|
|
111
|
+
]
|
|
112
|
+
File.write(File.join(cassette_path, "commands.yml"), YAML.dump(commands))
|
|
113
|
+
|
|
114
|
+
# Try to replay with different params
|
|
115
|
+
cassette_loaded = Super8::Cassette.new(cassette_name)
|
|
116
|
+
cassette_loaded.load
|
|
117
|
+
|
|
118
|
+
wrapper = Super8::PlaybackDatabaseWrapper.new(cassette_loaded, 1)
|
|
119
|
+
|
|
120
|
+
expect {
|
|
121
|
+
wrapper.run("SELECT * FROM users", 456)
|
|
122
|
+
}.to raise_error(Super8::CommandMismatchError) do |error|
|
|
123
|
+
expect(error.message).to eq("params: expected [123], got [456]")
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
end
|
data/spec/super8_spec.rb
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
require "super8"
|
|
2
|
+
require "fakefs/spec_helpers"
|
|
3
|
+
|
|
4
|
+
RSpec.describe Super8 do
|
|
5
|
+
include FakeFS::SpecHelpers
|
|
6
|
+
|
|
7
|
+
describe ".config" do
|
|
8
|
+
it "returns a Config instance" do
|
|
9
|
+
expect(described_class.config).to be_a(Super8::Config)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
it "returns the same instance on repeated calls" do
|
|
13
|
+
expect(described_class.config).to be(described_class.config) # rubocop:disable RSpec/IdenticalEqualityAssertion
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
describe ".configure" do
|
|
18
|
+
it "yields the config" do
|
|
19
|
+
expect { |b| described_class.configure(&b) }.to yield_with_args(Super8::Config)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it "allows setting cassette_directory" do
|
|
23
|
+
described_class.configure { |c| c.cassette_directory = "custom/path" }
|
|
24
|
+
expect(described_class.config.cassette_directory).to eq("custom/path")
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
describe ".use_cassette" do
|
|
29
|
+
it "yields to the block" do
|
|
30
|
+
called = false
|
|
31
|
+
described_class.use_cassette("test") { called = true }
|
|
32
|
+
expect(called).to be true
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: super8
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.2.1
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- John Cipriano
|
|
8
|
+
bindir: bin
|
|
9
|
+
cert_chain: []
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
|
+
dependencies:
|
|
12
|
+
- !ruby/object:Gem::Dependency
|
|
13
|
+
name: ruby-odbc
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - "~>"
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: '0.99'
|
|
19
|
+
type: :runtime
|
|
20
|
+
prerelease: false
|
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
22
|
+
requirements:
|
|
23
|
+
- - "~>"
|
|
24
|
+
- !ruby/object:Gem::Version
|
|
25
|
+
version: '0.99'
|
|
26
|
+
- !ruby/object:Gem::Dependency
|
|
27
|
+
name: csv
|
|
28
|
+
requirement: !ruby/object:Gem::Requirement
|
|
29
|
+
requirements:
|
|
30
|
+
- - "~>"
|
|
31
|
+
- !ruby/object:Gem::Version
|
|
32
|
+
version: '3.0'
|
|
33
|
+
type: :runtime
|
|
34
|
+
prerelease: false
|
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
36
|
+
requirements:
|
|
37
|
+
- - "~>"
|
|
38
|
+
- !ruby/object:Gem::Version
|
|
39
|
+
version: '3.0'
|
|
40
|
+
- !ruby/object:Gem::Dependency
|
|
41
|
+
name: fakefs
|
|
42
|
+
requirement: !ruby/object:Gem::Requirement
|
|
43
|
+
requirements:
|
|
44
|
+
- - "~>"
|
|
45
|
+
- !ruby/object:Gem::Version
|
|
46
|
+
version: '2.0'
|
|
47
|
+
type: :development
|
|
48
|
+
prerelease: false
|
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
50
|
+
requirements:
|
|
51
|
+
- - "~>"
|
|
52
|
+
- !ruby/object:Gem::Version
|
|
53
|
+
version: '2.0'
|
|
54
|
+
- !ruby/object:Gem::Dependency
|
|
55
|
+
name: rake
|
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
|
57
|
+
requirements:
|
|
58
|
+
- - "~>"
|
|
59
|
+
- !ruby/object:Gem::Version
|
|
60
|
+
version: '13.0'
|
|
61
|
+
type: :development
|
|
62
|
+
prerelease: false
|
|
63
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
64
|
+
requirements:
|
|
65
|
+
- - "~>"
|
|
66
|
+
- !ruby/object:Gem::Version
|
|
67
|
+
version: '13.0'
|
|
68
|
+
- !ruby/object:Gem::Dependency
|
|
69
|
+
name: rspec
|
|
70
|
+
requirement: !ruby/object:Gem::Requirement
|
|
71
|
+
requirements:
|
|
72
|
+
- - "~>"
|
|
73
|
+
- !ruby/object:Gem::Version
|
|
74
|
+
version: '3.0'
|
|
75
|
+
type: :development
|
|
76
|
+
prerelease: false
|
|
77
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
78
|
+
requirements:
|
|
79
|
+
- - "~>"
|
|
80
|
+
- !ruby/object:Gem::Version
|
|
81
|
+
version: '3.0'
|
|
82
|
+
- !ruby/object:Gem::Dependency
|
|
83
|
+
name: diff-lcs
|
|
84
|
+
requirement: !ruby/object:Gem::Requirement
|
|
85
|
+
requirements:
|
|
86
|
+
- - "~>"
|
|
87
|
+
- !ruby/object:Gem::Version
|
|
88
|
+
version: '1.5'
|
|
89
|
+
type: :development
|
|
90
|
+
prerelease: false
|
|
91
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
92
|
+
requirements:
|
|
93
|
+
- - "~>"
|
|
94
|
+
- !ruby/object:Gem::Version
|
|
95
|
+
version: '1.5'
|
|
96
|
+
description: Super 8 is a "vcr"-like library for recording and playing back ODBC interactions
|
|
97
|
+
made with ruby-odbc, for use with automated testing. More accurate than manually
|
|
98
|
+
mocking and less work than adding an ODBC-enabled server to your test stack.
|
|
99
|
+
email:
|
|
100
|
+
- johnmikecip@gmail.com
|
|
101
|
+
executables: []
|
|
102
|
+
extensions: []
|
|
103
|
+
extra_rdoc_files: []
|
|
104
|
+
files:
|
|
105
|
+
- LICENSE
|
|
106
|
+
- README.md
|
|
107
|
+
- lib/super8.rb
|
|
108
|
+
- lib/super8/cassette.rb
|
|
109
|
+
- lib/super8/config.rb
|
|
110
|
+
- lib/super8/diff_helper.rb
|
|
111
|
+
- lib/super8/errors.rb
|
|
112
|
+
- lib/super8/playback_database_wrapper.rb
|
|
113
|
+
- lib/super8/playback_statement_wrapper.rb
|
|
114
|
+
- lib/super8/recording_database_wrapper.rb
|
|
115
|
+
- lib/super8/recording_statement_wrapper.rb
|
|
116
|
+
- lib/super8/version.rb
|
|
117
|
+
- spec/spec_helper.rb
|
|
118
|
+
- spec/super8/cassette_spec.rb
|
|
119
|
+
- spec/super8/config_spec.rb
|
|
120
|
+
- spec/super8/odbc_interception_spec.rb
|
|
121
|
+
- spec/super8/playback_spec.rb
|
|
122
|
+
- spec/super8_spec.rb
|
|
123
|
+
homepage: https://github.com/johncip/super8
|
|
124
|
+
licenses:
|
|
125
|
+
- MIT
|
|
126
|
+
metadata:
|
|
127
|
+
homepage_uri: https://github.com/johncip/super8
|
|
128
|
+
rubygems_mfa_required: 'true'
|
|
129
|
+
rdoc_options: []
|
|
130
|
+
require_paths:
|
|
131
|
+
- lib
|
|
132
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
133
|
+
requirements:
|
|
134
|
+
- - ">="
|
|
135
|
+
- !ruby/object:Gem::Version
|
|
136
|
+
version: 3.1.0
|
|
137
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
138
|
+
requirements:
|
|
139
|
+
- - ">="
|
|
140
|
+
- !ruby/object:Gem::Version
|
|
141
|
+
version: '0'
|
|
142
|
+
requirements: []
|
|
143
|
+
rubygems_version: 3.6.8
|
|
144
|
+
specification_version: 4
|
|
145
|
+
summary: Record and replay ruby-odbc sessions for easier, more accurate testing.
|
|
146
|
+
test_files: []
|