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