master
  1require "rails_helper"
  2
  3describe Csv::Import do
  4  include_context "stronglifts_program"
  5  subject { Csv::Import.new(user, program) }
  6  let(:user) { create(:user) }
  7
  8  describe "#can_parse?" do
  9    let(:directory) { Dir.mktmpdir }
 10
 11    context "when the directory contains a csv export" do
 12      before :each do
 13        file_path = "#{directory}/spreadsheet-stronglifts-csv20151114-1138"
 14        FileUtils.touch(file_path)
 15      end
 16
 17      it "returns true" do
 18        expect(subject.can_parse?(directory)).to be_truthy
 19      end
 20    end
 21
 22    context "when the directory does not have csv export" do
 23      it "returns false" do
 24        expect(subject.can_parse?(directory)).to be_falsey
 25      end
 26    end
 27  end
 28
 29  describe "#import_from" do
 30    let(:directory) { Dir.mktmpdir }
 31    let(:backup_file) do
 32      Rails.root.join("spec", "fixtures", "spreadsheet-stronglifts.csv")
 33    end
 34
 35    before :each do
 36      `cp #{backup_file} #{directory}/spreadsheet-stronglifts.csv#{rand}`
 37    end
 38
 39    after :each do
 40      FileUtils.remove_entry(directory)
 41    end
 42
 43    it "imports each training session" do
 44      subject.import_from(directory)
 45      workout = user.workouts.order(:occurred_at).first
 46
 47      expected_date = user.time_zone.local_to_utc(Time.utc(2015, 03, 02))
 48      expect(workout.occurred_at).to eql(expected_date)
 49      expect(workout.routine).to eql(routine_a)
 50      expect(workout.body_weight).to eql(205.0.lbs)
 51      expect(workout.sets.count).to eql(15)
 52      expect(
 53        workout.sets.map { |x| x.exercise.name }.uniq
 54      ).to match_array(["Squat", "Bench Press", "Barbell Row"])
 55    end
 56
 57    it "imports the completed squat exercise" do
 58      subject.import_from(directory)
 59
 60      workout = user.workouts.order(:occurred_at).first
 61      squat_session = workout.progress_for(squat)
 62
 63      expect(squat_session.to_sets).to eql([5, 5, 5, 5, 5])
 64    end
 65
 66    it "imports the completed bench exercise" do
 67      subject.import_from(directory)
 68
 69      workout = user.workouts.order(:occurred_at).first
 70      bench_session = workout.progress_for(bench_press)
 71      expect(bench_session.sets.count).to eql(5)
 72      expect(bench_session.to_sets).to eql([5, 5, 5, 5, 5])
 73    end
 74
 75    it "imports the completed barbell row exercise" do
 76      subject.import_from(directory)
 77
 78      workout = user.workouts.order(:occurred_at).first
 79      progress = workout.progress_for(barbell_row)
 80      expect(progress.to_sets).to eql([5, 5, 5, 5, 5])
 81      sets = progress.sets.to_a
 82      expect(sets.at(0).target_weight).to eql(65.0)
 83      expect(sets.at(0).actual_repetitions).to eql(5)
 84      expect(sets.at(1).target_weight).to eql(65.0)
 85      expect(sets.at(1).actual_repetitions).to eql(5)
 86      expect(sets.at(2).target_weight).to eql(65.0)
 87      expect(sets.at(2).actual_repetitions).to eql(5)
 88      expect(sets.at(3).target_weight).to eql(65.0)
 89      expect(sets.at(3).actual_repetitions).to eql(5)
 90      expect(sets.at(4).target_weight).to eql(65.0)
 91      expect(sets.at(4).actual_repetitions).to eql(5)
 92    end
 93
 94    it "excludes items that have already been imported" do
 95      subject.import_from(directory)
 96      subject.import_from(directory)
 97      expect(user.workouts.count).to eql(356)
 98    end
 99  end
100
101  describe "#import" do
102    it "imports dips" do
103      row = '11/06/15,,,215,Squat,,265,5,5,5,,,Bench Press,,170,5,5,5,5,5,Barbell Row,,150,5,5,5,5,5,Weighted Dips,,12.5,5,5,5,Planks,,0,60,60,60,,,,,'.split(',')
104      subject.import(row)
105
106      workout = user.workouts.first
107      progress = workout.progress_for(dips)
108      expect(progress).to_not be_nil
109      expect(progress.to_sets).to eql([5, 5, 5])
110    end
111
112    it "imports chinups" do
113      row = '03/14/15,,,205,Squat,,85,5,5,5,5,5,Overhead Press,,70,5,5,5,5,5,Deadlift,,115,5,,,,,Chinups,,0,5,3,2,,,,,,,,,'.split(',')
114      subject.import(row)
115
116      workout = user.workouts.first
117      progress = workout.progress_for(chinups)
118      expect(progress).to_not be_nil
119      expect(progress.to_sets).to eql([5, 3, 2])
120      sets = progress.sets.to_a
121      expect(sets.at(0).target_weight).to eql(0.0)
122      expect(sets.at(0).target_repetitions).to eql(5)
123      expect(sets.at(0).actual_repetitions).to eql(5)
124      expect(sets.at(1).target_weight).to eql(0.0)
125      expect(sets.at(1).target_repetitions).to eql(5)
126      expect(sets.at(1).actual_repetitions).to eql(3)
127      expect(sets.at(2).target_weight).to eql(0.0)
128      expect(sets.at(2).target_repetitions).to eql(5)
129      expect(sets.at(2).actual_repetitions).to eql(2)
130    end
131
132    it "imports the correct number of sets" do
133      row = "06/05/16,,,231,Squat,,285,5,5,5,,,Overhead Press,,127,5,5,5,3,2,Deadlift,,305,5,,,,,Chinups,,0,5,4,4,Close Grip Bench Press,,110,5,5,5,,,,,".split(',')
134
135      subject.import(row)
136      workout = user.workouts.first
137      progress = workout.progress_for(squat)
138      expect(progress.sets.count).to eql(3)
139      expect(progress.to_sets).to eql([5, 5, 5])
140
141      progress = workout.progress_for(deadlift)
142      expect(progress.sets.count).to eql(1)
143      expect(progress.to_sets).to eql([5])
144    end
145  end
146end