Commit 673f0da

mo khan <mo@mokhan.ca>
2015-05-31 16:00:21
extract training history model and start to refactor way we add workouts.
1 parent 7d5da75
app/models/training_history.rb
@@ -0,0 +1,21 @@
+class TrainingHistory
+  include ActiveModel::Model
+  attr_reader :user, :exercise
+
+  def initialize(user, exercise)
+    @user = user
+    @exercise = exercise
+  end
+
+  def to_line_chart
+    user.
+      exercise_sessions.
+      includes(:training_session).
+      joins(:exercise).
+      where(exercises: { name: exercise.name }).
+      inject({}) do |memo, session|
+        memo[session.training_session.occurred_at] = session.target_weight
+        memo
+      end
+  end
+end
app/models/user.rb
@@ -25,14 +25,20 @@ class User < ActiveRecord::Base
   end
 
   def history_for(exercise)
-    exercise_sessions.
-      includes(:training_session).
-      joins(:exercise).
-      where(exercises: { name: exercise.name }).
-      inject({}) do |memo, session|
-        memo[session.training_session.occurred_at] = session.target_weight
-        memo
-      end
+    TrainingHistory.new(self, exercise)
+  end
+
+  def begin_workout(workout, date, body_weight)
+    matching_workouts = training_sessions.where(occurred_at: date)
+    if matching_workouts.any?
+      matching_workouts.first
+    else
+      training_sessions.create!(
+        workout: workout,
+        occurred_at: date,
+        body_weight: body_weight.to_f
+      )
+    end
   end
 
   def self.authenticate(username,password)
app/views/profiles/show.html.erb
@@ -29,8 +29,7 @@
 
     <h2>Training History</h2>
     <% @program.exercises.uniq.each do |exercise| %>
-      <%= line_chart @user.history_for(exercise) %>
-      <p><%= exercise.name %></p>
+      <%= render @user.history_for(exercise) %>
     <% end %>
   </div>
   <div class="small-2 columns">
app/views/training_histories/_training_history.html.erb
@@ -0,0 +1,2 @@
+<%= line_chart training_history.to_line_chart %>
+<p><%= training_history.exercise.name %> </p>
spec/models/training_history_spec.rb
@@ -0,0 +1,27 @@
+require "rails_helper"
+
+describe TrainingHistory do
+  include_context "stronglifts_program"
+  subject { TrainingHistory.new(user, squat) }
+  let(:user) { create(:user) }
+
+  describe "#to_line_chart" do
+    before :each do
+      workout_a.exercise_workouts.each do |recommendation|
+        user.exercise_sessions.create!(
+          target_weight: 200,
+          exercise_workout: recommendation,
+          sets: [5,5,5,5,5]
+        )
+
+        session = user.begin(workout_a)
+        session.train(squat, 200, [5,5,5,5,5])
+      end
+    end
+
+    it "returns the history in the format required for the chart" do
+      result = subject.to_line_chart
+      expect(result).to_not be_nil
+    end
+  end
+end
spec/models/user_spec.rb
@@ -141,4 +141,31 @@ describe User do
       expect(user.personal_record(exercise)).to eql(205.0)
     end
   end
+
+  describe "#begin_workout" do
+    subject { create(:user) }
+    let(:workout) { create(:workout) }
+    let(:today) { DateTime.now }
+
+    it "creates a new training session" do
+      result = subject.begin_workout(workout, today, 200)
+      expect(result).to be_persisted
+      expect(subject.training_sessions.count).to eql(1)
+      expect(subject.training_sessions.first).to eql(result)
+      expect(result.workout).to eql(workout)
+      expect(result.occurred_at).to eql(today.utc)
+      expect(result.body_weight).to eql(200.0)
+    end
+
+    it "returns the existing workout for that day" do
+      result = subject.begin_workout(workout, today, 200)
+      expect(subject.begin_workout(workout, today, 200)).to eql(result)
+    end
+
+    it "returns different sessions for different days" do
+      todays_result = subject.begin_workout(workout, today, 200)
+      tomorrows_result = subject.begin_workout(workout, DateTime.tomorrow, 200)
+      expect(todays_result).to_not eql(tomorrows_result)
+    end
+  end
 end