Commit 9531340

mo khan <mo@mokhan.ca>
2015-11-21 22:17:37
do not create duplicate exercise_sessions.
1 parent 9f1728f
Changed files (2)
app/models/training_session.rb
@@ -6,11 +6,18 @@ class TrainingSession < ActiveRecord::Base
 
   def train(exercise, target_weight, completed_sets)
     recommendation = workout.exercise_workouts.find_by(exercise: exercise)
-    exercise_sessions.create!(
-      target_weight: target_weight,
-      exercise_workout: recommendation,
-      sets: completed_sets
-    )
+
+    session = exercise_sessions.find_by(exercise_workout: recommendation)
+    if session.present?
+      session.update!(sets: completed_sets, target_weight: target_weight)
+      session
+    else
+      exercise_sessions.create!(
+        exercise_workout: recommendation,
+        sets: completed_sets,
+        target_weight: target_weight
+      )
+    end
   end
 
   def progress_for(exercise)
spec/models/training_session_spec.rb
@@ -20,6 +20,25 @@ describe TrainingSession, type: :model do
       expect(result.exercise).to eql(squat)
       expect(result.sets).to eql(sets.map(&:to_s))
     end
+
+    it "updates a completed exercise" do
+      subject.train(squat, target_weight, sets)
+
+      new_weight = target_weight + 10
+      new_sets = [5, 5, 5]
+      result = subject.train(squat, new_weight, new_sets)
+      expect(result).to be_persisted
+      expect(result.target_weight).to eql(new_weight.to_f)
+      expect(result.exercise).to eql(squat)
+      expect(result.sets).to eql(new_sets.map(&:to_s))
+    end
+
+    it "cannot save a duplicate exercise" do
+      result = subject.train(squat, target_weight, sets)
+      subject.train(squat, target_weight, sets)
+      expect(subject.exercise_sessions.count).to eql(1)
+      expect(subject.exercise_sessions).to match_array([result])
+    end
   end
 
   describe "#progress_for" do