Commit 673f0da
Changed files (6)
app
models
views
profiles
training_histories
spec
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