Skip to content

Commit

Permalink
V2/watchexec feature test (#232)
Browse files Browse the repository at this point in the history
* Create Watchexec feature specs
* Build watchexec in separate image
* Add command to build watchexec image
  • Loading branch information
AlexB52 authored Dec 5, 2024
1 parent 55e4dbf commit 2deadc8
Show file tree
Hide file tree
Showing 20 changed files with 685 additions and 34 deletions.
1 change: 1 addition & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ jobs:
- rspec-rails
- rspec-ruby
- bundler-app
- watchexec-ruby-app
steps:
- uses: actions/checkout@v4
- name: Set up Ruby
Expand Down
7 changes: 7 additions & 0 deletions bin/build/watchexec
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#!/usr/bin/env bash

docker buildx build \
--platform linux/amd64,linux/arm64 \
-t ghcr.io/alexb52/slim-bullseye-watchexec:latest \
-f builds/dockerfiles/WatchexecSlimBullseye \
--push .
7 changes: 7 additions & 0 deletions bin/test/watchexec-ruby-app
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#!/usr/bin/env bash

bundle install
bundle exec rake build
# cp -R features/support features/watchexec-ruby-app/retest
ls -t pkg | head -n1 | xargs -I {} mv pkg/{} features/watchexec-ruby-app/retest.gem
docker compose -f features/watchexec-ruby-app/docker-compose.yml up --build --exit-code-from retest
12 changes: 12 additions & 0 deletions builds/dockerfiles/WatchexecSlimBullseye
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# Stage 1: Build watchexec with Rust
FROM rust:1.83.0-slim-bullseye AS rust-builder

# Install necessary dependencies for Rust
RUN apt-get update -qq && \
apt-get install --no-install-recommends -y build-essential git

# Install watchexec
RUN cargo install watchexec-cli

# Verify installation
RUN watchexec --version
3 changes: 3 additions & 0 deletions features/watchexec-ruby-app/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
.ruby-version
retest.gem
/tmp/*
33 changes: 33 additions & 0 deletions features/watchexec-ruby-app/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
FROM ruby:2.7-slim-bullseye

# Install necessary dependencies
RUN apt-get update -qq && \
apt-get install --no-install-recommends -y build-essential git && \
apt-get clean && rm -rf /var/lib/apt/lists/*

# Copy watchexec from the Rust stage
COPY --from=ghcr.io/alexb52/slim-bullseye-watchexec:latest /usr/local/cargo/bin/watchexec /usr/local/bin/watchexec

# Verify watchexec installation in the final image
RUN watchexec --version

# throw errors if Gemfile has been modified since Gemfile.lock
RUN bundle config --global frozen 1

WORKDIR /usr/src/app

ENV LANG C.UTF-8
ENV BUNDLER_VERSION 2.1
ENV GEM_HOME="/usr/local/bundle"
ENV PATH $GEM_HOME/bin:$GEM_HOME/gems/bin:$PATH

COPY Gemfile Gemfile.lock retest.gem ./
RUN gem update --system 3.2.3
RUN gem install bundler -v 2.1.4
RUN bundle config --delete frozen
RUN bundle install
RUN gem install retest.gem

COPY . /usr/src/app

CMD ["retest", "--ruby"]
3 changes: 3 additions & 0 deletions features/watchexec-ruby-app/Gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
source 'https://rubygems.org'
gem 'minitest', '~> 5.4'
gem 'byebug'
15 changes: 15 additions & 0 deletions features/watchexec-ruby-app/Gemfile.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
GEM
remote: https://rubygems.org/
specs:
byebug (11.1.3)
minitest (5.14.0)

PLATFORMS
ruby

DEPENDENCIES
byebug
minitest (~> 5.4)

BUNDLED WITH
2.4.21
21 changes: 21 additions & 0 deletions features/watchexec-ruby-app/LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
MIT License

Copyright (c) 2020 Alexandre Barret

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
23 changes: 23 additions & 0 deletions features/watchexec-ruby-app/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# 99 Bottles

## Installing Ruby

### Windows

There's an installer, it's easy.
http://rubyinstaller.org/

### Mac

Newer macs ship with a usable version of Ruby.

Try `ruby -v` in a terminal window, and if it's 1.9.x or 2.x you're fine.

http://www.railstutorial.org/book/beginning#sec-install_ruby
http://tutorials.jumpstartlab.com/topics/environment/environment.html
http://docs.railsbridge.org/installfest/macintosh

### Linux

Ubuntu: http://docs.railsbridge.org/installfest/linux
https://www.ruby-lang.org/en/installation/
9 changes: 9 additions & 0 deletions features/watchexec-ruby-app/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
services:
retest:
build: .
volumes:
- .:/usr/src/app
environment:
- DEFAULT_SLEEP_SECONDS=1
- LAUNCH_SLEEP_SECONDS=1.5
command: ruby retest/retest_test.rb
119 changes: 119 additions & 0 deletions features/watchexec-ruby-app/lib/bottles.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
class CountdownSong
attr_reader :verse_template, :max, :min

def initialize(verse_template:, max: 999999, min: 0)
@verse_template = verse_template
@max, @min = max, min
end

def song
verses(max, min)
end

def verses(upper, lower)
upper.downto(lower).collect {|i| verse(i)}.join("\n")
end

def verse(number)
verse_template.lyrics(number)
end
end


class BottleVerse
def self.lyrics(number)
new(BottleNumber.for(number)).lyrics
end

attr_reader :bottle_number

def initialize(bottle_number)
@bottle_number = bottle_number
end

def lyrics
"#{bottle_number} of beer on the wall, ".capitalize +
"#{bottle_number} of beer.\n" +
"#{bottle_number.action}, " +
"#{bottle_number.successor} of beer on the wall.\n"
end
end


class BottleNumber
def self.for(number)
case number
when 0
BottleNumber0
when 1
BottleNumber1
when 6
BottleNumber6
else
BottleNumber
end.new(number)
end

attr_reader :number
def initialize(number)
@number = number
end

def to_s
"#{quantity} #{container}"
end

def quantity
number.to_s
end

def container
"bottles"
end

def action
"Take #{pronoun} down and pass it around"
end

def pronoun
"one"
end

def successor
BottleNumber.for(number - 1)
end
end

class BottleNumber0 < BottleNumber
def quantity
"no more"
end

def action
"Go to the store and buy some more"
end

def successor
BottleNumber.for(99)
end
end

class BottleNumber1 < BottleNumber
def container
"bottle"
end

def pronoun
"it"
end
end

class BottleNumber6 < BottleNumber
def quantity
"1"
end

def container
"six-pack"
end
end
16 changes: 16 additions & 0 deletions features/watchexec-ruby-app/retest/retest_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
require 'retest'
require 'byebug'
require_relative 'support/test_helper'
require 'minitest/autorun'
require_relative 'retest_test/file_changes_test'
require_relative 'retest_test/setup_test'
require_relative 'retest_test/matching_unmatching_command_test'

$stdout.sync = true

include FileHelper
include OutputHelper

module WatchexecRuby
COMMAND = 'retest'
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
module WatchexecRuby
class FileChangesTest < Minitest::Test
def teardown
end_retest
end

def test_start_retest
launch_retest(COMMAND)

assert_match <<~EXPECTED, read_output
Setup identified: [RUBY]. Using command: 'bundle exec ruby <test>'
Watcher: [WATCHEXEC]
Launching Retest...
Ready to refactor! You can make file changes now
EXPECTED
end

def test_modifying_existing_file
launch_retest(COMMAND)

modify_file('lib/bottles.rb')

read_output do |output|
assert_match "Test file: test/bottles_test.rb", output
assert_match "12 runs, 12 assertions, 0 failures, 0 errors, 0 skips", output
end
end

def test_modifying_existing_test_file
launch_retest(COMMAND)

modify_file('test/bottles_test.rb')

read_output do |output|
assert_match "Test file: test/bottles_test.rb", output
assert_match "12 runs, 12 assertions, 0 failures, 0 errors, 0 skips", output
end
end

def test_creating_a_new_test_file
launch_retest(COMMAND)

create_file 'foo_test.rb'

assert_match "Test file: foo_test.rb", read_output

ensure
delete_file 'foo_test.rb'
end

def test_creating_a_new_file
launch_retest(COMMAND)

create_file 'foo.rb'
assert_match <<~EXPECTED, read_output
FileNotFound - Retest could not find a matching test file to run.
EXPECTED

create_file 'foo_test.rb'
assert_match "Test file: foo_test.rb", read_output

modify_file('lib/bottles.rb')
assert_match "Test file: test/bottles_test.rb", read_output

modify_file('foo.rb')
assert_match "Test file: foo_test.rb", read_output

ensure
delete_file 'foo.rb'
delete_file 'foo_test.rb'
end

def test_untracked_file
create_file 'foo.rb', should_sleep: false
create_file 'foo_test.rb', should_sleep: false

launch_retest(COMMAND)

modify_file 'foo.rb'
assert_match "Test file: foo_test.rb", read_output

ensure
delete_file 'foo.rb'
delete_file 'foo_test.rb'
end
end
end
Loading

0 comments on commit 2deadc8

Please sign in to comment.