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.
@@ -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
@@ -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: []