crspec 0.1.1 → 0.1.2

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.
Files changed (158) hide show
  1. checksums.yaml +4 -4
  2. data/lib/crspec/version.rb +1 -1
  3. metadata +1 -156
  4. data/benchmark/README.md +0 -56
  5. data/benchmark/run.rb +0 -72
  6. data/benchmark/spec/user_service_crspec_spec.rb +0 -15
  7. data/benchmark/spec/user_service_rspec_spec.rb +0 -16
  8. data/benchmark/target_service.rb +0 -12
  9. data/benchmark/test/user_service_test.rb +0 -18
  10. data/demo.rb +0 -129
  11. data/samples/book_store/.dockerignore +0 -51
  12. data/samples/book_store/.gitattributes +0 -9
  13. data/samples/book_store/.github/dependabot.yml +0 -12
  14. data/samples/book_store/.github/workflows/ci.yml +0 -130
  15. data/samples/book_store/.gitignore +0 -35
  16. data/samples/book_store/.kamal/hooks/docker-setup.sample +0 -3
  17. data/samples/book_store/.kamal/hooks/post-app-boot.sample +0 -3
  18. data/samples/book_store/.kamal/hooks/post-deploy.sample +0 -14
  19. data/samples/book_store/.kamal/hooks/post-proxy-reboot.sample +0 -3
  20. data/samples/book_store/.kamal/hooks/pre-app-boot.sample +0 -3
  21. data/samples/book_store/.kamal/hooks/pre-build.sample +0 -51
  22. data/samples/book_store/.kamal/hooks/pre-connect.sample +0 -47
  23. data/samples/book_store/.kamal/hooks/pre-deploy.sample +0 -122
  24. data/samples/book_store/.kamal/hooks/pre-proxy-reboot.sample +0 -3
  25. data/samples/book_store/.kamal/secrets +0 -20
  26. data/samples/book_store/.rubocop.yml +0 -8
  27. data/samples/book_store/.ruby-version +0 -1
  28. data/samples/book_store/Dockerfile +0 -77
  29. data/samples/book_store/Gemfile +0 -67
  30. data/samples/book_store/Gemfile.lock +0 -572
  31. data/samples/book_store/README.md +0 -24
  32. data/samples/book_store/Rakefile +0 -6
  33. data/samples/book_store/app/assets/images/.keep +0 -0
  34. data/samples/book_store/app/assets/stylesheets/application.css +0 -10
  35. data/samples/book_store/app/controllers/application_controller.rb +0 -2
  36. data/samples/book_store/app/controllers/books_controller.rb +0 -30
  37. data/samples/book_store/app/controllers/comments_controller.rb +0 -21
  38. data/samples/book_store/app/controllers/concerns/.keep +0 -0
  39. data/samples/book_store/app/controllers/users_controller.rb +0 -21
  40. data/samples/book_store/app/helpers/application_helper.rb +0 -2
  41. data/samples/book_store/app/helpers/books_helper.rb +0 -2
  42. data/samples/book_store/app/helpers/comments_helper.rb +0 -2
  43. data/samples/book_store/app/helpers/users_helper.rb +0 -2
  44. data/samples/book_store/app/javascript/application.js +0 -3
  45. data/samples/book_store/app/javascript/controllers/application.js +0 -9
  46. data/samples/book_store/app/javascript/controllers/hello_controller.js +0 -7
  47. data/samples/book_store/app/javascript/controllers/index.js +0 -4
  48. data/samples/book_store/app/jobs/application_job.rb +0 -7
  49. data/samples/book_store/app/mailers/application_mailer.rb +0 -4
  50. data/samples/book_store/app/models/application_record.rb +0 -3
  51. data/samples/book_store/app/models/book.rb +0 -10
  52. data/samples/book_store/app/models/comment.rb +0 -6
  53. data/samples/book_store/app/models/concerns/.keep +0 -0
  54. data/samples/book_store/app/models/user.rb +0 -4
  55. data/samples/book_store/app/views/layouts/application.html.erb +0 -29
  56. data/samples/book_store/app/views/layouts/mailer.html.erb +0 -13
  57. data/samples/book_store/app/views/layouts/mailer.text.erb +0 -1
  58. data/samples/book_store/app/views/pwa/manifest.json.erb +0 -22
  59. data/samples/book_store/app/views/pwa/service-worker.js +0 -26
  60. data/samples/book_store/bin/brakeman +0 -7
  61. data/samples/book_store/bin/bundler-audit +0 -6
  62. data/samples/book_store/bin/ci +0 -6
  63. data/samples/book_store/bin/dev +0 -2
  64. data/samples/book_store/bin/docker-entrypoint +0 -8
  65. data/samples/book_store/bin/importmap +0 -4
  66. data/samples/book_store/bin/jobs +0 -6
  67. data/samples/book_store/bin/kamal +0 -16
  68. data/samples/book_store/bin/rails +0 -4
  69. data/samples/book_store/bin/rake +0 -4
  70. data/samples/book_store/bin/rubocop +0 -8
  71. data/samples/book_store/bin/setup +0 -35
  72. data/samples/book_store/bin/thrust +0 -5
  73. data/samples/book_store/config/application.rb +0 -27
  74. data/samples/book_store/config/boot.rb +0 -4
  75. data/samples/book_store/config/bundler-audit.yml +0 -5
  76. data/samples/book_store/config/cable.yml +0 -17
  77. data/samples/book_store/config/cache.yml +0 -16
  78. data/samples/book_store/config/ci.rb +0 -24
  79. data/samples/book_store/config/credentials.yml.enc +0 -1
  80. data/samples/book_store/config/database.yml +0 -45
  81. data/samples/book_store/config/deploy.yml +0 -119
  82. data/samples/book_store/config/environment.rb +0 -5
  83. data/samples/book_store/config/environments/development.rb +0 -78
  84. data/samples/book_store/config/environments/production.rb +0 -90
  85. data/samples/book_store/config/environments/test.rb +0 -53
  86. data/samples/book_store/config/importmap.rb +0 -7
  87. data/samples/book_store/config/initializers/assets.rb +0 -7
  88. data/samples/book_store/config/initializers/content_security_policy.rb +0 -29
  89. data/samples/book_store/config/initializers/filter_parameter_logging.rb +0 -8
  90. data/samples/book_store/config/initializers/inflections.rb +0 -16
  91. data/samples/book_store/config/locales/en.yml +0 -31
  92. data/samples/book_store/config/puma.rb +0 -42
  93. data/samples/book_store/config/queue.yml +0 -18
  94. data/samples/book_store/config/recurring.yml +0 -15
  95. data/samples/book_store/config/routes.rb +0 -17
  96. data/samples/book_store/config/storage.yml +0 -27
  97. data/samples/book_store/config.ru +0 -6
  98. data/samples/book_store/db/cable_schema.rb +0 -11
  99. data/samples/book_store/db/cache_schema.rb +0 -12
  100. data/samples/book_store/db/migrate/20260731035441_create_users.rb +0 -10
  101. data/samples/book_store/db/migrate/20260731035506_create_books.rb +0 -11
  102. data/samples/book_store/db/migrate/20260731035528_create_comments.rb +0 -11
  103. data/samples/book_store/db/queue_schema.rb +0 -129
  104. data/samples/book_store/db/schema.rb +0 -39
  105. data/samples/book_store/db/seeds.rb +0 -9
  106. data/samples/book_store/lib/tasks/.keep +0 -0
  107. data/samples/book_store/log/.keep +0 -0
  108. data/samples/book_store/public/400.html +0 -135
  109. data/samples/book_store/public/404.html +0 -135
  110. data/samples/book_store/public/406-unsupported-browser.html +0 -135
  111. data/samples/book_store/public/422.html +0 -135
  112. data/samples/book_store/public/500.html +0 -135
  113. data/samples/book_store/public/icon.png +0 -0
  114. data/samples/book_store/public/icon.svg +0 -3
  115. data/samples/book_store/public/robots.txt +0 -1
  116. data/samples/book_store/script/.keep +0 -0
  117. data/samples/book_store/spec/models/book_spec.rb +0 -42
  118. data/samples/book_store/spec/models/comment_spec.rb +0 -22
  119. data/samples/book_store/spec/models/user_advanced_spec.rb +0 -27
  120. data/samples/book_store/spec/models/user_spec.rb +0 -30
  121. data/samples/book_store/spec/rails_helper.rb +0 -36
  122. data/samples/book_store/spec/rails_parallel_spec.rb +0 -23
  123. data/samples/book_store/spec/requests/books_spec.rb +0 -21
  124. data/samples/book_store/spec/requests/users_spec.rb +0 -14
  125. data/samples/book_store/spec/services/inventory_service_spec.rb +0 -28
  126. data/samples/book_store/spec/services/time_dependent_service_spec.rb +0 -26
  127. data/samples/book_store/spec/spec_helper.rb +0 -16
  128. data/samples/book_store/spec/system/book_store_system_spec.rb +0 -18
  129. data/samples/book_store/storage/.keep +0 -0
  130. data/samples/book_store/test/controllers/.keep +0 -0
  131. data/samples/book_store/test/controllers/books_controller_test.rb +0 -7
  132. data/samples/book_store/test/controllers/comments_controller_test.rb +0 -7
  133. data/samples/book_store/test/controllers/users_controller_test.rb +0 -7
  134. data/samples/book_store/test/fixtures/books.yml +0 -11
  135. data/samples/book_store/test/fixtures/comments.yml +0 -11
  136. data/samples/book_store/test/fixtures/files/.keep +0 -0
  137. data/samples/book_store/test/fixtures/users.yml +0 -9
  138. data/samples/book_store/test/helpers/.keep +0 -0
  139. data/samples/book_store/test/integration/.keep +0 -0
  140. data/samples/book_store/test/mailers/.keep +0 -0
  141. data/samples/book_store/test/models/.keep +0 -0
  142. data/samples/book_store/test/models/book_test.rb +0 -7
  143. data/samples/book_store/test/models/comment_test.rb +0 -7
  144. data/samples/book_store/test/models/user_test.rb +0 -7
  145. data/samples/book_store/test/test_helper.rb +0 -15
  146. data/samples/book_store/tmp/.keep +0 -0
  147. data/samples/book_store/tmp/pids/.keep +0 -0
  148. data/samples/book_store/tmp/storage/.keep +0 -0
  149. data/samples/book_store/vendor/.keep +0 -0
  150. data/samples/book_store/vendor/javascript/.keep +0 -0
  151. data/samples/user_spec.rb +0 -31
  152. data/test/crspec/configuration_test.rb +0 -76
  153. data/test/crspec/execution_context_test.rb +0 -61
  154. data/test/crspec/mock_test.rb +0 -55
  155. data/test/crspec/rails_test.rb +0 -62
  156. data/test/crspec/runner_test.rb +0 -68
  157. data/test/crspec/transpiler_test.rb +0 -41
  158. data/test/test_helper.rb +0 -6
@@ -1,76 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "test_helper"
4
- require "tmpdir"
5
-
6
- class ConfigurationTest < Minitest::Test
7
- def setup
8
- Crspec.reset_configuration!
9
- end
10
-
11
- def teardown
12
- Crspec.reset_configuration!
13
- end
14
-
15
- def test_configuration_hooks_and_module_inclusion
16
- helper_module = Module.new do
17
- def custom_helper_method
18
- "helper_ok"
19
- end
20
- end
21
-
22
- before_called = false
23
- after_called = false
24
-
25
- Crspec.configure do |config|
26
- config.include(helper_module)
27
- config.before(:each) { before_called = true }
28
- config.after(:each) { after_called = true }
29
- end
30
-
31
- group = Crspec.describe "Configured Group" do
32
- it "uses included module and runs global hooks" do
33
- expect(custom_helper_method).to eq("helper_ok")
34
- end
35
- end
36
-
37
- runner = Crspec::Runner.new(concurrency: 1, formatter: Crspec::Formatters::NullFormatter.new)
38
- runner.run([group])
39
-
40
- assert runner.success?
41
- assert before_called
42
- assert after_called
43
- end
44
-
45
- def test_init_generator_in_non_rails_project_creates_only_spec_helper
46
- Dir.mktmpdir do |dir|
47
- spec_dir = File.join(dir, "spec")
48
- created = Crspec::Generators::Init.generate(spec_dir, dir)
49
-
50
- assert_equal 1, created.size
51
- assert File.exist?(File.join(spec_dir, "spec_helper.rb"))
52
- refute File.exist?(File.join(spec_dir, "rails_helper.rb"))
53
-
54
- spec_helper_content = File.read(File.join(spec_dir, "spec_helper.rb"))
55
- assert_includes spec_helper_content, "Crspec.configure"
56
- end
57
- end
58
-
59
- def test_init_generator_in_rails_project_creates_both_helpers
60
- Dir.mktmpdir do |dir|
61
- FileUtils.mkdir_p(File.join(dir, "config"))
62
- File.write(File.join(dir, "config", "application.rb"), "# Rails app")
63
-
64
- spec_dir = File.join(dir, "spec")
65
- created = Crspec::Generators::Init.generate(spec_dir, dir)
66
-
67
- assert_equal 2, created.size
68
- assert File.exist?(File.join(spec_dir, "spec_helper.rb"))
69
- assert File.exist?(File.join(spec_dir, "rails_helper.rb"))
70
-
71
- rails_helper_content = File.read(File.join(spec_dir, "rails_helper.rb"))
72
- assert_includes rails_helper_content, "require_relative \"spec_helper\""
73
- assert_includes rails_helper_content, "DatabaseIsolation.wrap_example"
74
- end
75
- end
76
- end
@@ -1,61 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "test_helper"
4
-
5
- class ExecutionContextTest < Minitest::Test
6
- def test_fiber_storage_isolation_and_inheritance
7
- parent_ctx = nil
8
- sub_fiber_ctx = nil
9
-
10
- Crspec::ExecutionContext.isolate("ex-1", { type: :model }) do |ctx|
11
- parent_ctx = ctx
12
- assert_equal "ex-1", Crspec::ExecutionContext.current.example_id
13
-
14
- # Sub-fiber created inside example inherits Fiber storage
15
- Fiber.new do
16
- sub_fiber_ctx = Crspec::ExecutionContext.current
17
- end.resume
18
- end
19
-
20
- assert_equal parent_ctx.example_id, sub_fiber_ctx.example_id
21
- end
22
-
23
- def test_per_fiber_lazy_memoization
24
- Crspec::ExecutionContext.isolate("ex-2") do
25
- ctx = Crspec::ExecutionContext.current
26
- count = 0
27
- val1 = ctx.fetch_memoized(:user) do
28
- count += 1
29
- "Jane"
30
- end
31
- val2 = ctx.fetch_memoized(:user) do
32
- count += 1
33
- "Jane"
34
- end
35
-
36
- assert_equal "Jane", val1
37
- assert_equal "Jane", val2
38
- assert_equal 1, count
39
- end
40
- end
41
-
42
- def test_thread_safety_memoization
43
- Crspec::ExecutionContext.isolate("ex-3") do
44
- ctx = Crspec::ExecutionContext.current
45
- counter = 0
46
- threads = Array.new(10) do
47
- Thread.new do
48
- ctx.fetch_memoized(:shared_calc) do
49
- sleep 0.01
50
- counter += 1
51
- 42
52
- end
53
- end
54
- end
55
-
56
- results = threads.map(&:value)
57
- assert_equal Array.new(10, 42), results
58
- assert_equal 1, counter
59
- end
60
- end
61
- end
@@ -1,55 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "test_helper"
4
-
5
- class MockTest < Minitest::Test
6
- class StripeClient
7
- def charge(amount)
8
- "real_charge_#{amount}"
9
- end
10
- end
11
-
12
- def test_fiber_isolated_stubs
13
- client = StripeClient.new
14
- fiber1_result = nil
15
- fiber2_result = nil
16
-
17
- f1 = Fiber.new do
18
- Crspec::Mock::Space.current.register_stub(client, :charge, proc { "stub_fiber_1" })
19
- fiber1_result = client.charge(100)
20
- end
21
-
22
- f2 = Fiber.new do
23
- Crspec::Mock::Space.current.register_stub(client, :charge, proc { "stub_fiber_2" })
24
- fiber2_result = client.charge(200)
25
- end
26
-
27
- f1.resume
28
- f2.resume
29
-
30
- assert_equal "stub_fiber_1", fiber1_result
31
- assert_equal "stub_fiber_2", fiber2_result
32
- assert_equal "real_charge_500", client.charge(500)
33
- end
34
-
35
- def test_double_and_expectation_dsl
36
- Crspec::ExecutionContext.isolate("mock-test") do
37
- stubs_mock = Crspec::Mock::Double.new("Stripe", charge: "ok")
38
- assert_equal "ok", stubs_mock.charge(50)
39
- end
40
- end
41
-
42
- def test_allow_receive_with_and_return
43
- group = Crspec.describe "PaymentGateway" do
44
- it "stubs method" do
45
- client = StripeClient.new
46
- allow(client).to receive(:charge).with(5000).and_return("succeeded")
47
- expect(client.charge(5000)).to eq("succeeded")
48
- end
49
- end
50
-
51
- runner = Crspec::Runner.new(concurrency: 1)
52
- runner.run([group])
53
- assert runner.success?
54
- end
55
- end
@@ -1,62 +0,0 @@
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
@@ -1,68 +0,0 @@
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
@@ -1,41 +0,0 @@
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 DELETED
@@ -1,6 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- $LOAD_PATH.unshift File.expand_path("../lib", __dir__)
4
- require "crspec"
5
-
6
- require "minitest/autorun"