Commit ce0a432
Changed files (7)
app
assets
javascripts
templates
controllers
models
spec
app/assets/javascripts/templates/workout_view.ractive
@@ -13,7 +13,7 @@
{{#each sets}}
<div class="row">
<div class="columns small-3">
- <button on-click="updateProgress" class="button round {{status}}">
+ <button id='{{id}}' on-click="updateProgress" class="button round {{status}}">
{{actual_repetitions}}
</button>
</div>
app/controllers/workouts_controller.rb
@@ -33,7 +33,7 @@ class WorkoutsController < ApplicationController
end
def recent_workouts
- current_user.workouts.recent.includes(:routine, exercise_sets: [:exercise])
+ current_user.workouts.recent.includes(:routine)
end
def find_routine(routine_id)
app/models/exercise_set.rb
@@ -1,4 +1,5 @@
class ExerciseSet < ActiveRecord::Base
belongs_to :exercise
belongs_to :workout
+ scope :for, ->(exercise) { where(exercise: exercise).order(:created_at) }
end
spec/features/workouts_spec.rb
@@ -30,4 +30,42 @@ feature "Workouts", type: :feature do
expect(user.workouts.last.body_weight).to eql(225.0)
end
end
+
+ feature "recording a workout", js: true do
+ include_context "stronglifts_program"
+
+ subject { EditWorkoutPage.new(workout) }
+
+ let!(:workout) do
+ squat_workout
+ bench_workout
+ row_workout
+ dips_workout
+ workout = user.next_workout_for(routine_a)
+ workout.update!(occurred_at: DateTime.now, body_weight: 225)
+ workout
+ end
+
+ before :each do
+ subject.visit_page
+ subject.open_section(squat)
+ end
+
+ it 'saves the successful set' do
+ first_squat_set = workout.sets.for(squat).at(0)
+ subject.complete(set: first_squat_set)
+ expect(first_squat_set.reload.actual_repetitions).to eql(5)
+ end
+
+ it 'saves the failed set' do
+ second_squat_set = workout.sets.for(squat).at(1)
+ subject.complete(set: second_squat_set, repetitions: 4)
+ expect(second_squat_set.reload.actual_repetitions).to eql(4)
+ end
+
+ it 'does not change an incomplete set' do
+ third_squat_set = workout.sets.for(squat).at(2)
+ expect(third_squat_set.reload.actual_repetitions).to be_nil
+ end
+ end
end
spec/support/pages/edit_workout_page.rb
@@ -0,0 +1,19 @@
+require_relative "../page_model.rb"
+
+class EditWorkoutPage < PageModel
+ def initialize(workout)
+ super edit_workout_path(workout)
+ end
+
+ def open_section(exercise)
+ click_link(exercise.name)
+ end
+
+ def complete(set: , repetitions: 5)
+ click_map = { 5 => 1, 4 => 2, 3 => 3, 2 => 4, 1 => 5 }
+ click_map[repetitions].times do
+ find_by_id(set.id).click
+ wait_for_ajax
+ end
+ end
+end
spec/support/page_model.rb
@@ -34,6 +34,17 @@ class PageModel
Nokogiri::HTML(page.html)
end
+ def record_failure(dir = Rails.root.join("tmp", "screenshots"))
+ puts pretty_print
+ FileUtils.mkdir_p(dir)
+ now = DateTime.now
+ path = File.join(dir, "#{now.to_s.parameterize}.png")
+ puts "saving screenshot to: #{path}"
+ page.save_screenshot(path, full: true)
+ rescue => error
+ puts error.inspect
+ end
+
private
def translate(key)
spec/rails_helper.rb
@@ -73,7 +73,7 @@ RSpec.configure do |config|
config.after(:each) do |example|
if example.metadata[:type] == :feature && example.exception.present?
- puts subject.pretty_print
+ subject.record_failure
end
end
end