Commit ce0a432

mo khan <mo@mokhan.ca>
2016-06-27 23:44:58
add spec for recording workout results.
1 parent 6da0e41
Changed files (7)
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