Skip to content

Commit

Permalink
WIP feature tests
Browse files Browse the repository at this point in the history
  • Loading branch information
AlexB52 committed Dec 8, 2024
1 parent e2a7a3b commit 49d69e0
Show file tree
Hide file tree
Showing 8 changed files with 210 additions and 27 deletions.
1 change: 1 addition & 0 deletions features/bundler-app/lib/bundler_app.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

require_relative "bundler_app/version"
require_relative "bundler_app/bottles"
require_relative "bundler_app/fibonacci"

module BundlerApp
class Error < StandardError; end
Expand Down
11 changes: 11 additions & 0 deletions features/bundler-app/lib/bundler_app/fibonacci.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# fibonacci.rb
class Fibonacci
def self.calculate(n)
raise ArgumentError, "Input must be a non-negative integer." unless n.is_a?(Integer) && n >= 0
return n if n <= 1

a, b = 0, 1
(n - 1).times { a, b = b, a + b }
b
end
end
3 changes: 2 additions & 1 deletion features/bundler-app/retest/retest_test.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
require 'retest'
require_relative 'support/test_helper'
require 'minitest/autorun'
require_relative 'retest_test/file_changes_test'
# require_relative 'retest_test/file_changes_test'
require_relative 'retest_test/interactive_commands_test'

$stdout.sync = true
4 changes: 2 additions & 2 deletions features/bundler-app/retest/retest_test/file_changes_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -76,8 +76,8 @@ def test_creating_a_new_file
end

def test_untracked_file
create_file 'lib/bundler_app/foo.rb', should_sleep: false
create_file 'test/bundler_app/test_foo.rb', should_sleep: false
create_file 'lib/bundler_app/foo.rb', sleep_for: 0
create_file 'test/bundler_app/test_foo.rb', sleep_for: 0

launch_retest @command

Expand Down
125 changes: 125 additions & 0 deletions features/bundler-app/retest/retest_test/interactive_commands_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
class InteractiveCommandTest < Minitest::Test
include FileHelper
include InputHelper
include OutputHelper
include CommandHelper
include AssertionsHelper

def setup
@command = 'retest'
end

def teardown
end_retest
end

def test_start_help_exit
launch_retest @command

assert_output_matches <<~EXPECTED.chomp
Setup identified: [RAKE]. Using command: 'bundle exec rake test TEST=<test>'
Watcher: [LISTEN]
Launching Retest...
Ready to refactor! You can make file changes now
Type interactive command and press enter. Enter 'h' for help.
>\s
EXPECTED

write_input("h\n")

assert_output_matches <<~EXPECTED.chomp
* 'h', 'help' # Prints help.
* 'p', 'pause' # Pauses Retest. Tests aren't run on file change events until unpaused.
* 'u', 'unpause' # Unpauses Retest.
* <ENTER> # Runs last changed triggered command.
* 'ra, 'run all' # Runs all tests.
* 'f', 'force' # Forces a selection of test to run on every file change.
* 'r', 'reset' # Disables forced selection.
* 'd', 'diff' [GIT BRANCH] # Runs matching specs that changed from a target branch.
* 'e', 'exit' # Exits Retest.
Type interactive command and press enter. Enter 'h' for help.
>\s
EXPECTED
end

def test_pause_unpause_retest
launch_retest @command

modify_file('lib/bundler_app/bottles.rb')

assert_output_matches(
"Test file: test/bundler_app/test_bottles.rb",
"12 runs, 12 assertions, 0 failures, 0 errors, 0 skips"
)

write_input("p\n")

assert_output_matches "Program is paused"

modify_file('lib/bundler_app/bottles.rb')

assert_output_matches <<~EXPECTED
File changed: lib/bundler_app/bottles.rb
Main program paused. Please resume program first.
EXPECTED

write_input("u\n")

modify_file('lib/bundler_app/bottles.rb')

assert_output_matches(
"Test file: test/bundler_app/test_bottles.rb",
"12 runs, 12 assertions, 0 failures, 0 errors, 0 skips"
)
end

def test_force_a_file_to_run
launch_retest @command

write_input("f\n")

assert_output_matches "What test files do you want to run when saving a file? (min. 1)"

write_input("fib\s\n")

assert_output_matches <<~EXPECTED
Forced selection enabled.
Reset to default settings by typing 'r' in the interactive console.
Tests selected:
- test/bundler_app/test_fibonacci.rb
EXPECTED

assert_output_matches "8 runs, 9 assertions, 0 failures, 0 errors, 0 skips"

modify_file('lib/bundler_app/bottles.rb')

assert_output_matches <<~EXPECTED
Forced selection enabled.
Reset to default settings by typing 'r' in the interactive console.
Tests selected:
- test/bundler_app/test_fibonacci.rb
EXPECTED

write_input("r\n")

modify_file('lib/bundler_app/bottles.rb')

assert_output_matches(
"Test file: test/bundler_app/test_bottles.rb",
"12 runs, 12 assertions, 0 failures, 0 errors, 0 skips")
end

def test_run_all
launch_retest @command

write_input("ra\n")

assert_output_matches(
"Running all tests",
"21 runs, 21 assertions, 0 failures, 0 errors, 0 skips")
end
end
21 changes: 0 additions & 21 deletions features/bundler-app/retest/support/output_file.rb

This file was deleted.

32 changes: 29 additions & 3 deletions features/bundler-app/retest/support/test_helper.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,25 @@
# Can be updated to all feature repositories with
# $ bin/test/reset_helpers

module AssertionsHelper
# OutputHelper dependency
def assert_output_matches(*expectations, max_retries: 5)
retries = 0
wait_for = 0.1
output = ""
begin
output += read_output
expectations.each { |expectation| assert_match(expectation, output) }
rescue Minitest::Assertion => e
raise e if retries >= max_retries
retries += 1
sleep_seconds = wait_for ** -(wait_for * retries)
sleep sleep_seconds
retry
end
end
end

module OutputHelper
def read_output(output = @output)
result = ""
Expand All @@ -18,6 +37,13 @@ def read_output(output = @output)
end
end

module InputHelper
def write_input(command, input: @input, sleep_seconds: 0.1)
input.write(command)
sleep sleep_seconds
end
end

module FileHelper
def default_sleep_seconds
Float(ENV.fetch('DEFAULT_SLEEP_SECONDS', 1))
Expand All @@ -40,10 +66,10 @@ def modify_file(path, sleep_seconds: default_sleep_seconds)
sleep sleep_seconds
end

def create_file(path, should_sleep: true, sleep_seconds: default_sleep_seconds)
File.open(path, "w").tap(&:close)
def create_file(path, content: "", sleep_seconds: default_sleep_seconds)
File.open(path, "w") { |f| f.write(content) }

sleep sleep_seconds if should_sleep
sleep sleep_seconds
end

def delete_file(path)
Expand Down
40 changes: 40 additions & 0 deletions features/bundler-app/test/bundler_app/test_fibonacci.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# frozen_string_literal: true

require 'test_helper'

module BundlerApp
class FibonacciTest < Minitest::Test
def test_fibonacci_zero
assert_equal 0, Fibonacci.calculate(0)
end

def test_fibonacci_one
assert_equal 1, Fibonacci.calculate(1)
end

def test_fibonacci_two
assert_equal 1, Fibonacci.calculate(2)
end

def test_fibonacci_five
assert_equal 5, Fibonacci.calculate(5)
end

def test_fibonacci_ten
assert_equal 55, Fibonacci.calculate(10)
end

def test_large_fibonacci
assert_equal 6765, Fibonacci.calculate(20) # Example large Fibonacci number
end

def test_invalid_input_negative
assert_raises(ArgumentError) { Fibonacci.calculate(-1) }
end

def test_invalid_input_non_integer
assert_raises(ArgumentError) { Fibonacci.calculate(2.5) }
assert_raises(ArgumentError) { Fibonacci.calculate("five") }
end
end
end

0 comments on commit 49d69e0

Please sign in to comment.