crspec 0.1.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 +7 -0
- data/CHANGELOG.md +5 -0
- data/LICENSE.txt +21 -0
- data/README.md +180 -0
- data/Rakefile +13 -0
- data/demo.rb +126 -0
- data/exe/crspec +9 -0
- data/exe/crspec-transpile +8 -0
- data/lib/crspec/cli.rb +82 -0
- data/lib/crspec/dsl.rb +39 -0
- data/lib/crspec/example.rb +53 -0
- data/lib/crspec/example_group.rb +154 -0
- data/lib/crspec/execution_context.rb +62 -0
- data/lib/crspec/expectations.rb +44 -0
- data/lib/crspec/formatters/progress_formatter.rb +50 -0
- data/lib/crspec/matchers.rb +203 -0
- data/lib/crspec/mock/double.rb +285 -0
- data/lib/crspec/mock/interceptor.rb +35 -0
- data/lib/crspec/mock/space.rb +81 -0
- data/lib/crspec/rails/database_isolation.rb +29 -0
- data/lib/crspec/rails/parallel.rb +98 -0
- data/lib/crspec/rails/system_server.rb +35 -0
- data/lib/crspec/runner.rb +97 -0
- data/lib/crspec/transpiler/cli.rb +108 -0
- data/lib/crspec/transpiler/rewriter.rb +70 -0
- data/lib/crspec/version.rb +5 -0
- data/lib/crspec.rb +23 -0
- data/samples/user_spec.rb +31 -0
- data/sig/crspec.rbs +4 -0
- data/test/crspec/execution_context_test.rb +61 -0
- data/test/crspec/mock_test.rb +55 -0
- data/test/crspec/rails_test.rb +62 -0
- data/test/crspec/runner_test.rb +68 -0
- data/test/crspec/transpiler_test.rb +41 -0
- data/test/test_helper.rb +6 -0
- metadata +96 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "test_helper"
|
|
4
|
+
require "minitest/mock"
|
|
5
|
+
|
|
6
|
+
class RailsTest < Minitest::Test
|
|
7
|
+
def setup
|
|
8
|
+
Crspec::Rails::Parallel.reset!
|
|
9
|
+
Crspec.reset!
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def teardown
|
|
13
|
+
Crspec::Rails::Parallel.reset!
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def test_database_isolation_wrapper
|
|
17
|
+
mock_example = Minitest::Mock.new
|
|
18
|
+
mock_example.expect(:execute!, true)
|
|
19
|
+
|
|
20
|
+
Crspec::Rails::DatabaseIsolation.wrap_example(mock_example)
|
|
21
|
+
assert mock_example.verify
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def test_system_server_start
|
|
25
|
+
Crspec::Rails::SystemServer.reset!
|
|
26
|
+
refute Crspec::Rails::SystemServer.running?
|
|
27
|
+
|
|
28
|
+
Crspec::Rails::SystemServer.start_concurrent_server!(nil, 9887)
|
|
29
|
+
assert Crspec::Rails::SystemServer.running?
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def test_rails_parallel_test_setup_and_teardown_hooks
|
|
33
|
+
setup_called = []
|
|
34
|
+
teardown_called = []
|
|
35
|
+
|
|
36
|
+
Crspec::Rails::Parallel.parallelize(workers: 2) do
|
|
37
|
+
parallelize_setup do |worker_num|
|
|
38
|
+
setup_called << worker_num
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
parallelize_teardown do |worker_num|
|
|
42
|
+
teardown_called << worker_num
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
assert Crspec::Rails::Parallel.enabled?
|
|
47
|
+
assert_equal 2, Crspec::Rails::Parallel.worker_count
|
|
48
|
+
|
|
49
|
+
group = Crspec.describe "Parallel Test Group" do
|
|
50
|
+
it "runs example" do
|
|
51
|
+
expect(1).to eq(1)
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
runner = Crspec::Runner.new(concurrency: 2)
|
|
56
|
+
runner.run([group])
|
|
57
|
+
|
|
58
|
+
assert runner.success?
|
|
59
|
+
assert_equal [1, 2], setup_called.sort
|
|
60
|
+
assert_equal [1, 2], teardown_called.sort
|
|
61
|
+
end
|
|
62
|
+
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "test_helper"
|
|
4
|
+
|
|
5
|
+
class RunnerTest < Minitest::Test
|
|
6
|
+
def setup
|
|
7
|
+
Crspec.reset!
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def test_concurrent_runner_execution
|
|
11
|
+
group = Crspec.describe "User Model" do
|
|
12
|
+
let(:name) { "Alice" }
|
|
13
|
+
|
|
14
|
+
it "validates name" do
|
|
15
|
+
expect(name).to eq("Alice")
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it "calculates async property" do
|
|
19
|
+
expect(1 + 1).to eq(2)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
formatter = Crspec::Formatters::NullFormatter.new
|
|
24
|
+
runner = Crspec::Runner.new(concurrency: 2, formatter: formatter)
|
|
25
|
+
runner.run([group])
|
|
26
|
+
|
|
27
|
+
assert runner.success?
|
|
28
|
+
assert_equal 2, runner.passed_examples.size
|
|
29
|
+
assert_equal 0, runner.failed_examples.size
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def test_failing_example_recorded
|
|
33
|
+
group = Crspec.describe "Failing Suite" do
|
|
34
|
+
it "fails expectation" do
|
|
35
|
+
expect(1).to eq(2)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
formatter = Crspec::Formatters::NullFormatter.new
|
|
40
|
+
runner = Crspec::Runner.new(concurrency: 1, formatter: formatter)
|
|
41
|
+
runner.run([group])
|
|
42
|
+
|
|
43
|
+
refute runner.success?
|
|
44
|
+
assert_equal 1, runner.failed_examples.size
|
|
45
|
+
assert_equal "Expected 2, got 1", runner.failed_examples.first.error.message
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def test_progress_formatter_output
|
|
49
|
+
out = StringIO.new
|
|
50
|
+
formatter = Crspec::Formatters::ProgressFormatter.new(out, color: false)
|
|
51
|
+
|
|
52
|
+
group = Crspec.describe "Formatter Suite" do
|
|
53
|
+
it "passes" do
|
|
54
|
+
expect(1).to eq(1)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it "fails" do
|
|
58
|
+
expect(1).to eq(2)
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
runner = Crspec::Runner.new(concurrency: 1, formatter: formatter)
|
|
63
|
+
runner.run([group])
|
|
64
|
+
|
|
65
|
+
assert_includes out.string, "."
|
|
66
|
+
assert_includes out.string, "F"
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "test_helper"
|
|
4
|
+
|
|
5
|
+
class TranspilerTest < Minitest::Test
|
|
6
|
+
def test_prism_ast_rewriting_rspec_to_crspec
|
|
7
|
+
source = <<~RUBY
|
|
8
|
+
RSpec.describe User, type: :model do
|
|
9
|
+
let(:valid_attributes) { { name: "Jane" } }
|
|
10
|
+
it "validates attributes" do
|
|
11
|
+
expect(1).to eq(1)
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
RUBY
|
|
15
|
+
|
|
16
|
+
rewriter = Crspec::Transpiler::Rewriter.new(source)
|
|
17
|
+
transformed = rewriter.transpile
|
|
18
|
+
|
|
19
|
+
assert_includes transformed, "Crspec.describe User"
|
|
20
|
+
refute_includes transformed, "RSpec.describe"
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def test_detects_thread_unsafe_before_all
|
|
24
|
+
source = <<~RUBY
|
|
25
|
+
Crspec.describe Account do
|
|
26
|
+
before(:all) do
|
|
27
|
+
@account = Account.create!
|
|
28
|
+
end
|
|
29
|
+
it "tests something" do
|
|
30
|
+
expect(1).to eq(1)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
RUBY
|
|
34
|
+
|
|
35
|
+
rewriter = Crspec::Transpiler::Rewriter.new(source)
|
|
36
|
+
rewriter.transpile
|
|
37
|
+
|
|
38
|
+
refute_empty rewriter.warnings
|
|
39
|
+
assert_includes rewriter.warnings.first, "before(:all) mutates global state"
|
|
40
|
+
end
|
|
41
|
+
end
|
data/test/test_helper.rb
ADDED
metadata
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: crspec
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Aboobacker MK
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: exe
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2026-07-29 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: prism
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - ">="
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: 0.19.0
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - ">="
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: 0.19.0
|
|
27
|
+
description: Next-generation Ruby test runner using Fiber Storage isolation (Ruby
|
|
28
|
+
3.2+), fiber-aware mocks, connection leasing, and Prism AST transpilation.
|
|
29
|
+
email:
|
|
30
|
+
- aboobackervyd@gmail.com
|
|
31
|
+
executables:
|
|
32
|
+
- crspec
|
|
33
|
+
- crspec-transpile
|
|
34
|
+
extensions: []
|
|
35
|
+
extra_rdoc_files: []
|
|
36
|
+
files:
|
|
37
|
+
- CHANGELOG.md
|
|
38
|
+
- LICENSE.txt
|
|
39
|
+
- README.md
|
|
40
|
+
- Rakefile
|
|
41
|
+
- demo.rb
|
|
42
|
+
- exe/crspec
|
|
43
|
+
- exe/crspec-transpile
|
|
44
|
+
- lib/crspec.rb
|
|
45
|
+
- lib/crspec/cli.rb
|
|
46
|
+
- lib/crspec/dsl.rb
|
|
47
|
+
- lib/crspec/example.rb
|
|
48
|
+
- lib/crspec/example_group.rb
|
|
49
|
+
- lib/crspec/execution_context.rb
|
|
50
|
+
- lib/crspec/expectations.rb
|
|
51
|
+
- lib/crspec/formatters/progress_formatter.rb
|
|
52
|
+
- lib/crspec/matchers.rb
|
|
53
|
+
- lib/crspec/mock/double.rb
|
|
54
|
+
- lib/crspec/mock/interceptor.rb
|
|
55
|
+
- lib/crspec/mock/space.rb
|
|
56
|
+
- lib/crspec/rails/database_isolation.rb
|
|
57
|
+
- lib/crspec/rails/parallel.rb
|
|
58
|
+
- lib/crspec/rails/system_server.rb
|
|
59
|
+
- lib/crspec/runner.rb
|
|
60
|
+
- lib/crspec/transpiler/cli.rb
|
|
61
|
+
- lib/crspec/transpiler/rewriter.rb
|
|
62
|
+
- lib/crspec/version.rb
|
|
63
|
+
- samples/user_spec.rb
|
|
64
|
+
- sig/crspec.rbs
|
|
65
|
+
- test/crspec/execution_context_test.rb
|
|
66
|
+
- test/crspec/mock_test.rb
|
|
67
|
+
- test/crspec/rails_test.rb
|
|
68
|
+
- test/crspec/runner_test.rb
|
|
69
|
+
- test/crspec/transpiler_test.rb
|
|
70
|
+
- test/test_helper.rb
|
|
71
|
+
homepage: https://github.com/crspec/crspec
|
|
72
|
+
licenses:
|
|
73
|
+
- MIT
|
|
74
|
+
metadata:
|
|
75
|
+
homepage_uri: https://github.com/crspec/crspec
|
|
76
|
+
source_code_uri: https://github.com/crspec/crspec
|
|
77
|
+
post_install_message:
|
|
78
|
+
rdoc_options: []
|
|
79
|
+
require_paths:
|
|
80
|
+
- lib
|
|
81
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
82
|
+
requirements:
|
|
83
|
+
- - ">="
|
|
84
|
+
- !ruby/object:Gem::Version
|
|
85
|
+
version: 3.2.0
|
|
86
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
87
|
+
requirements:
|
|
88
|
+
- - ">="
|
|
89
|
+
- !ruby/object:Gem::Version
|
|
90
|
+
version: '0'
|
|
91
|
+
requirements: []
|
|
92
|
+
rubygems_version: 3.5.22
|
|
93
|
+
signing_key:
|
|
94
|
+
specification_version: 4
|
|
95
|
+
summary: Concurrent, fiber-isolated Ruby testing framework ecosystem
|
|
96
|
+
test_files: []
|