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.
@@ -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
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ $LOAD_PATH.unshift File.expand_path("../lib", __dir__)
4
+ require "crspec"
5
+
6
+ require "minitest/autorun"
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: []