learn-open 1.2.20 → 1.2.21

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +4 -0
  3. data/Guardfile +70 -0
  4. data/learn-open.gemspec +7 -1
  5. data/lib/learn_open.rb +66 -0
  6. data/lib/learn_open/adapters/io_adapter.rb +24 -0
  7. data/lib/learn_open/adapters/learn_web_adapter.rb +103 -0
  8. data/lib/learn_open/adapters/system_adapter.rb +30 -0
  9. data/lib/learn_open/environments.rb +35 -0
  10. data/lib/learn_open/environments/base_environment.rb +70 -0
  11. data/lib/learn_open/environments/generic_environment.rb +9 -0
  12. data/lib/learn_open/environments/ide_environment.rb +63 -0
  13. data/lib/learn_open/environments/jupyter_container_environment.rb +28 -0
  14. data/lib/learn_open/environments/linux_environment.rb +17 -0
  15. data/lib/learn_open/environments/mac_environment.rb +75 -0
  16. data/lib/learn_open/lessons.rb +24 -0
  17. data/lib/learn_open/lessons/base_lesson.rb +57 -0
  18. data/lib/learn_open/lessons/ios_lesson.rb +14 -0
  19. data/lib/learn_open/lessons/jupyter_lesson.rb +14 -0
  20. data/lib/learn_open/lessons/lab_lesson.rb +9 -0
  21. data/lib/learn_open/lessons/readme_lesson.rb +13 -0
  22. data/lib/learn_open/opener.rb +26 -469
  23. data/lib/learn_open/services/dependency_installers.rb +19 -0
  24. data/lib/learn_open/services/dependency_installers/base_installer.rb +21 -0
  25. data/lib/learn_open/services/dependency_installers/gem_installer.rb +14 -0
  26. data/lib/learn_open/services/dependency_installers/jupyter_pip_installer.rb +14 -0
  27. data/lib/learn_open/services/dependency_installers/node_package_installer.rb +20 -0
  28. data/lib/learn_open/services/dependency_installers/pip_installer.rb +14 -0
  29. data/lib/learn_open/services/file_backup_starter.rb +20 -0
  30. data/lib/learn_open/services/lesson_downloader.rb +82 -0
  31. data/lib/learn_open/services/logger.rb +23 -0
  32. data/lib/learn_open/version.rb +1 -1
  33. data/spec/fakes/fake_git.rb +20 -0
  34. data/spec/fakes/fake_learn_client.rb +214 -0
  35. data/spec/fixtures/learn-config +3 -0
  36. data/spec/learn_open/environments/ide_environment_spec.rb +62 -0
  37. data/spec/learn_open/opener_spec.rb +789 -14
  38. data/spec/spec_helper.rb +41 -0
  39. metadata +121 -5
  40. data/spec/home_dir/.learn-config +0 -3
@@ -0,0 +1,3 @@
1
+ ---
2
+ :learn_directory: "/Users/student/Development/code"
3
+ :editor: atom
@@ -0,0 +1,62 @@
1
+ require 'spec_helper'
2
+ require 'fakefs/spec_helpers'
3
+
4
+ describe LearnOpen::Environments::IDEEnvironment do
5
+ include FakeFS::SpecHelpers
6
+ subject { LearnOpen::Environments::IDEEnvironment }
7
+
8
+ let(:io) { instance_double(LearnOpen::Adapters::IOAdapter) }
9
+
10
+ context "Invalid environment" do
11
+ before do
12
+ @home_dir = create_linux_home_dir("bobby")
13
+
14
+ expect(io)
15
+ .to receive(:puts)
16
+ .with("Opening new window")
17
+ end
18
+
19
+ let(:lesson) { double(name: "a-different-lesson") }
20
+ let(:env_vars) {{ "LAB_NAME" => "correct_lab", "CREATED_USER" => "bobby" }}
21
+ let(:environment) { subject.new({ io: io, environment_vars: env_vars, logger: spy }) }
22
+
23
+ it "opens correct readme" do
24
+ environment.open_readme(lesson)
25
+ custom_commands_log = File.read("#{@home_dir}/.custom_commands.log")
26
+ expect(custom_commands_log).to eq(%Q{{"command":"open_lab","lab_name":"a-different-lesson"}\n})
27
+ end
28
+
29
+ it "opens correct lab" do
30
+ environment.open_lab(lesson, double, double)
31
+ custom_commands_log = File.read("#{@home_dir}/.custom_commands.log")
32
+ expect(custom_commands_log).to eq(%Q{{"command":"open_lab","lab_name":"a-different-lesson"}\n})
33
+ end
34
+
35
+ it "opens correct jupyter lab" do
36
+ environment.open_jupyter_lab(lesson, double, double)
37
+ custom_commands_log = File.read("#{@home_dir}/.custom_commands.log")
38
+ expect(custom_commands_log).to eq(%Q{{"command":"open_lab","lab_name":"a-different-lesson"}\n})
39
+ end
40
+ end
41
+
42
+ context "valid environments" do
43
+ before do
44
+ @home_dir = create_linux_home_dir("bobby")
45
+ end
46
+
47
+ let(:lesson) { double(name: "valid_lab", later_lesson: false, to_url: "valid-lesson-url") }
48
+ let(:env_vars) {{ "LAB_NAME" => "valid_lab", "CREATED_USER" => "bobby" }}
49
+ let(:environment) { subject.new({ io: io, environment_vars: env_vars, logger: spy }) }
50
+
51
+ it "opens the readme in the browser" do
52
+ expect(io).to receive(:puts).with("Opening readme...")
53
+ environment.open_readme(lesson)
54
+ custom_commands_log = File.read("#{@home_dir}/.custom_commands.log")
55
+ expect(custom_commands_log).to eq(%Q{{"command":"browser_open","url":"valid-lesson-url"}\n})
56
+ end
57
+ it "opens the lab" do
58
+ expect(io).to receive(:puts).with("Opening readme...")
59
+ environment.open_lab(lesson, double, double)
60
+ end
61
+ end
62
+ end
@@ -1,25 +1,800 @@
1
1
  require 'spec_helper'
2
+ require 'fakefs/spec_helpers'
3
+ require 'pry'
2
4
 
3
5
  describe LearnOpen::Opener do
4
- LearnOpen::Opener::HOME_DIR = File.join(__dir__, "..", "home_dir")
6
+ include FakeFS::SpecHelpers
7
+ let(:learn_web_client) { FakeLearnClient.new(token: "some-amazing-password") }
8
+ let(:git_adapter) { FakeGit.new }
9
+ let(:system_adapter) { class_double(LearnOpen::Adapters::SystemAdapter) }
5
10
 
6
- context "Verifying repo existance" do
7
- let(:opener) { LearnOpen::Opener.new("","","") }
8
- after do
9
- path = File.join(__dir__, "..", "home_dir", "code")
10
- FileUtils.rm_rf(path)
11
+ before do
12
+ create_home_dir
13
+ create_netrc_file
14
+ create_learn_config_file
15
+ end
16
+
17
+ context "Initializer" do
18
+ it "sets the lesson" do
19
+ opener = LearnOpen::Opener.new("ttt-2-board-rb-v-000","", false)
20
+ expect(opener.target_lesson).to eq("ttt-2-board-rb-v-000")
21
+ end
22
+ it "sets the editor" do
23
+ opener = LearnOpen::Opener.new("", "atom", false)
24
+ expect(opener.editor).to eq("atom")
11
25
  end
26
+ it "sets the whether to open the next lesson or not" do
27
+ opener = LearnOpen::Opener.new("", "", true)
28
+ expect(opener.get_next_lesson).to eq(true)
29
+ end
30
+ end
31
+
32
+ context "running the opener" do
33
+ it "calls its collaborators" do
34
+ expect(system_adapter)
35
+ .to receive(:open_editor)
36
+ .with("atom", path: ".")
12
37
 
13
- it "returns true if .git directory for lab exists" do
14
- expect(opener).to receive(:repo_dir).and_return("js-rubber-duck-wrangling")
15
- FileUtils.mkdir_p("#{opener.lessons_dir}/js-rubber-duck-wrangling/.git")
38
+ expect(system_adapter)
39
+ .to receive(:open_login_shell)
40
+ .with("/usr/local/bin/fish")
16
41
 
17
- expect(opener.repo_exists?).to be_truthy
42
+ expect(system_adapter)
43
+ .to receive(:change_context_directory)
44
+ .with("/home/bobby/Development/code/rails-dynamic-request-lab-cb-000")
45
+
46
+ expect(learn_web_client)
47
+ .to receive(:fork_repo)
48
+ .with(repo_name: "rails-dynamic-request-lab-cb-000")
49
+
50
+ opener = LearnOpen::Opener.new(nil, "atom", true,
51
+ learn_web_client: learn_web_client,
52
+ git_adapter: git_adapter,
53
+ environment_vars: {"SHELL" => "/usr/local/bin/fish"},
54
+ system_adapter: system_adapter,
55
+ io: spy)
56
+ opener.run
57
+ end
58
+ end
59
+ context "Opening on specific environments" do
60
+ before do
61
+ allow(system_adapter).to receive_messages(
62
+ open_editor: :noop,
63
+ open_login_shell: :noop,
64
+ change_context_directory: :noop
65
+ )
66
+ allow(learn_web_client).to receive(:fork_repo)
18
67
  end
68
+ context "IDE" do
69
+ it "restores files and watches for changes" do
70
+ environment = {
71
+ "SHELL" => "/usr/local/bin/fish",
72
+ "LAB_NAME" => "ruby_lab",
73
+ "CREATED_USER" => "bobby",
74
+ "IDE_CONTAINER" => "true",
75
+ "IDE_VERSION" => "3"
76
+ }
77
+
78
+ create_linux_home_dir("bobby")
79
+ expect(system_adapter)
80
+ .to receive(:spawn)
81
+ .with('restore-lab', block: true)
82
+ expect(system_adapter)
83
+ .to receive(:watch_dir)
84
+ .with("/home/bobby/Development/code/ruby_lab", "backup-lab")
85
+ expect(system_adapter)
86
+ .to receive(:run_command)
87
+ .with("bundle install")
88
+
89
+ opener = LearnOpen::Opener.new("ruby_lab", "atom", false,
90
+ learn_web_client: learn_web_client,
91
+ git_adapter: git_adapter,
92
+ environment_vars: environment,
93
+ system_adapter: system_adapter,
94
+ io: spy)
95
+ opener.run
96
+ end
97
+ it "does not write to the custom commands log if environment is for intended lab" do
98
+ environment = {
99
+ "SHELL" => "/usr/local/bin/fish",
100
+ "LAB_NAME" => "rails-dynamic-request-lab-cb-000",
101
+ "CREATED_USER" => "bobby",
102
+ "IDE_CONTAINER" => "true",
103
+ "IDE_VERSION" => "3"
104
+ }
105
+ allow(system_adapter).to receive_messages([:spawn, :watch_dir])
106
+
107
+ home_dir = create_linux_home_dir("bobby")
108
+ opener = LearnOpen::Opener.new(nil, "atom", true,
109
+ learn_web_client: learn_web_client,
110
+ git_adapter: git_adapter,
111
+ environment_vars: environment,
112
+ system_adapter: system_adapter,
113
+ io: spy)
114
+ opener.run
115
+ expect(File.exist?("#{home_dir}/.custom_commands.log")).to eq(false)
116
+ end
117
+
118
+ it "does not prompt if they want to skip lesson if the container is for a different lab" do
119
+ environment = {
120
+ "SHELL" => "/usr/local/bin/fish",
121
+ "LAB_NAME" => "Something wild",
122
+ "CREATED_USER" => "bobby",
123
+ "IDE_CONTAINER" => "true",
124
+ "IDE_VERSION" => "3"
125
+ }
126
+ io = instance_double(LearnOpen::Adapters::IOAdapter)
127
+ expect(io)
128
+ .to receive(:puts)
129
+ .with("Looking for lesson...")
130
+
131
+ expect(io)
132
+ .to receive(:puts)
133
+ .with("Opening new window")
134
+
135
+ create_linux_home_dir("bobby")
136
+ opener = LearnOpen::Opener.new("later_lesson", "atom", true,
137
+ learn_web_client: learn_web_client,
138
+ git_adapter: git_adapter,
139
+ environment_vars: environment,
140
+ system_adapter: system_adapter,
141
+ io: io)
142
+ opener.run
143
+ end
144
+ it "prompts if they want to skip lesson" do
145
+ environment = {
146
+ "SHELL" => "/usr/local/bin/fish",
147
+ "LAB_NAME" => "later_lesson",
148
+ "CREATED_USER" => "bobby",
149
+ "IDE_CONTAINER" => "true",
150
+ "IDE_VERSION" => "3"
151
+ }
152
+ io = instance_double(LearnOpen::Adapters::IOAdapter)
153
+ expect(io)
154
+ .to receive(:puts)
155
+ .with("Looking for lesson...")
156
+
157
+ expect(io)
158
+ .to receive(:puts)
159
+ .with("WARNING: You are attempting to open a lesson that is beyond your current lesson.")
160
+
161
+ expect(io)
162
+ .to receive(:print)
163
+ .with("Are you sure you want to continue? [Yn]: ")
164
+
165
+ expect(io)
166
+ .to receive(:gets)
167
+ .and_return("yes")
168
+
169
+ expect(io)
170
+ .to receive(:puts)
171
+ .with("Opening readme...")
172
+
173
+ create_linux_home_dir("bobby")
174
+ opener = LearnOpen::Opener.new("later_lesson", "atom", true,
175
+ learn_web_client: learn_web_client,
176
+ git_adapter: git_adapter,
177
+ environment_vars: environment,
178
+ system_adapter: system_adapter,
179
+ io: io)
180
+ opener.run
181
+ end
182
+ it "writes to custom_commands_log if lab name doesn't match env" do
183
+ environment = {
184
+ "SHELL" => "/usr/local/bin/fish",
185
+ "LAB_NAME" => "Something wild",
186
+ "CREATED_USER" => "bobby",
187
+ "IDE_CONTAINER" => "true",
188
+ "IDE_VERSION" => "3"
189
+ }
190
+ allow(system_adapter).to receive_messages([:spawn, :watch_dir])
191
+
192
+ home_dir = create_linux_home_dir("bobby")
193
+ opener = LearnOpen::Opener.new(nil, "atom", true,
194
+ learn_web_client: learn_web_client,
195
+ git_adapter: git_adapter,
196
+ environment_vars: environment,
197
+ system_adapter: system_adapter,
198
+ io: spy)
199
+ opener.run
200
+ custom_commands_log = File.read("#{home_dir}/.custom_commands.log")
201
+ expect(custom_commands_log).to eq("{\"command\":\"open_lab\",\"lab_name\":\"rails-dynamic-request-lab-cb-000\"}\n")
202
+ end
203
+
204
+ it "writes to custom_commands_log if only if it's IDE" do
205
+ environment = {
206
+ "SHELL" => "/usr/local/bin/fish",
207
+ "LAB_NAME" => "Something wild",
208
+ "CREATED_USER" => "bobby"
209
+ }
210
+ allow(system_adapter).to receive_messages([:spawn, :watch_dir])
211
+
212
+ home_dir = create_linux_home_dir("bobby")
213
+ opener = LearnOpen::Opener.new(nil, "atom", true,
214
+ learn_web_client: learn_web_client,
215
+ git_adapter: git_adapter,
216
+ environment_vars: environment,
217
+ system_adapter: system_adapter,
218
+ io: spy)
219
+ opener.run
220
+ expect(File.exist?("#{home_dir}/.custom_commands.log")).to eq(false)
221
+ end
222
+
223
+ it "runs yarn install if lab is a node lab" do
224
+ environment = {
225
+ "SHELL" => "/usr/local/bin/fish",
226
+ "LAB_NAME" => "node_lab",
227
+ "CREATED_USER" => "bobby",
228
+ "IDE_CONTAINER" => "true",
229
+ }
230
+ allow(system_adapter).to receive_messages([:spawn, :watch_dir])
231
+ expect(system_adapter)
232
+ .to receive(:open_editor)
233
+ .with("atom", path: ".")
234
+
235
+ expect(system_adapter)
236
+ .to receive(:open_login_shell)
237
+ .with("/usr/local/bin/fish")
238
+
239
+ expect(system_adapter)
240
+ .to receive(:change_context_directory)
241
+ .with("/home/bobby/Development/code/node_lab")
242
+
243
+ expect(system_adapter)
244
+ .to receive(:run_command)
245
+ .with("yarn install --no-lockfile")
246
+
247
+ opener = LearnOpen::Opener.new("node_lab", "atom", false,
248
+ learn_web_client: learn_web_client,
249
+ git_adapter: git_adapter,
250
+ environment_vars: environment,
251
+ system_adapter: system_adapter,
252
+ io: spy)
253
+ opener.run
254
+ end
255
+ end
256
+ end
257
+ context "Logging" do
258
+ let(:environment) {{ "SHELL" => "/usr/local/bin/fish", "JUPYTER_CONTAINER" => "true" }}
259
+ it "prints the right things" do
260
+ allow(learn_web_client).to receive(:fork_repo)
261
+
262
+ allow(git_adapter).to receive(:clone).and_call_original
263
+
264
+ allow(system_adapter).to receive_messages(
265
+ open_editor: :noop,
266
+ spawn: :noop,
267
+ watch_dir: :noop,
268
+ open_login_shell: :noop,
269
+ change_context_directory: :noop,
270
+ run_command: :noop,
271
+ )
272
+
273
+ io = StringIO.new
274
+
275
+ opener = LearnOpen::Opener.new("jupyter_lab", "atom", false,
276
+ learn_web_client: learn_web_client,
277
+ git_adapter: git_adapter,
278
+ environment_vars: environment,
279
+ system_adapter: system_adapter,
280
+ io: io)
281
+ opener.run
282
+ io.rewind
283
+ expect(io.read).to eq(<<-EOF)
284
+ Looking for lesson...
285
+ Forking lesson...
286
+ Cloning lesson...
287
+ Opening lesson...
288
+ Installing pip dependencies...
289
+ Done.
290
+ EOF
291
+ end
292
+
293
+ it "logs final status in file" do
294
+ allow(learn_web_client).to receive(:fork_repo)
295
+
296
+ allow(git_adapter).to receive(:clone).and_call_original
297
+
298
+ allow(system_adapter).to receive_messages(
299
+ open_editor: :noop,
300
+ spawn: :noop,
301
+ watch_dir: :noop,
302
+ open_login_shell: :noop,
303
+ change_context_directory: :noop,
304
+ run_command: :noop,
305
+ )
306
+
307
+
308
+ opener = LearnOpen::Opener.new("jupyter_lab", "atom", false,
309
+ learn_web_client: learn_web_client,
310
+ git_adapter: git_adapter,
311
+ environment_vars: environment,
312
+ system_adapter: system_adapter,
313
+ io: spy)
314
+ opener.run
315
+ expect(File.read("#{home_dir}/.learn-open-tmp")).to eq("Done.")
316
+ end
317
+ end
318
+ context "Lab Types" do
319
+ context "Jupyter Labs" do
320
+ it "correctly opens jupyter lab on jupyter container" do
321
+ environment = { "SHELL" => "/usr/local/bin/fish", "JUPYTER_CONTAINER" => "true" }
322
+ expect(learn_web_client)
323
+ .to receive(:fork_repo)
324
+ .with(repo_name: "jupyter_lab")
325
+
326
+ expect(git_adapter)
327
+ .to receive(:clone)
328
+ .with("git@github.com:StevenNunez/jupyter_lab.git", "jupyter_lab", {:path=>"/home/bobby/Development/code"})
329
+ .and_call_original
330
+
331
+ expect(system_adapter)
332
+ .to receive(:open_editor)
333
+ .with("atom", path: ".")
334
+ expect(system_adapter)
335
+ .to receive(:spawn)
336
+ .with("restore-lab", block: true)
337
+ expect(system_adapter)
338
+ .to receive(:watch_dir)
339
+ .with("/home/bobby/Development/code/jupyter_lab", "backup-lab")
340
+ expect(system_adapter)
341
+ .to receive(:open_login_shell)
342
+ .with("/usr/local/bin/fish")
343
+ expect(system_adapter)
344
+ .to receive(:change_context_directory)
345
+ .with("/home/bobby/Development/code/jupyter_lab")
346
+ expect(system_adapter)
347
+ .to receive(:run_command)
348
+ .with("/opt/conda/bin/python -m pip install -r requirements.txt")
349
+
350
+ opener = LearnOpen::Opener.new("jupyter_lab", "atom", false,
351
+ learn_web_client: learn_web_client,
352
+ git_adapter: git_adapter,
353
+ environment_vars: environment,
354
+ system_adapter: system_adapter,
355
+ io: spy)
356
+ opener.run
357
+ end
358
+
359
+ it "opens browser in IDE" do
360
+ environment = {"CREATED_USER" => "bobby", "IDE_CONTAINER" => "true", "LAB_NAME" => "jupyter_lab"}
361
+ io = StringIO.new
362
+ home_dir = create_linux_home_dir("bobby")
363
+ opener = LearnOpen::Opener.new("jupyter_lab", "atom", false,
364
+ learn_web_client: learn_web_client,
365
+ git_adapter: git_adapter,
366
+ environment_vars: environment,
367
+ system_adapter: system_adapter,
368
+ io: io)
369
+ opener.run
370
+ io.rewind
371
+ expect(io.read).to eq(<<-EOF)
372
+ Looking for lesson...
373
+ Opening Jupyter Lesson...
374
+ EOF
375
+
376
+ custom_commands_log = File.read("#{home_dir}/.custom_commands.log")
377
+ expect(custom_commands_log).to eq("{\"command\":\"browser_open\",\"url\":\"https://learn.co/lessons/31322\"}\n")
378
+ end
379
+ it "opens the lab in the safari on mac" do
380
+ expect(system_adapter)
381
+ .to receive(:run_command)
382
+ .with("open -a Safari https://learn.co/lessons/31322")
383
+ io = StringIO.new
384
+ opener = LearnOpen::Opener.new("jupyter_lab", "atom", false,
385
+ learn_web_client: learn_web_client,
386
+ git_adapter: git_adapter,
387
+ system_adapter: system_adapter,
388
+ io: io,
389
+ platform: "darwin")
390
+ opener.run
391
+ io.rewind
392
+ expect(io.read).to eq(<<-EOF)
393
+ Looking for lesson...
394
+ Opening Jupyter Lesson...
395
+ EOF
396
+ end
397
+ it "opens the lab in the chrome on mac if present" do
398
+ FileUtils.mkdir_p("/Applications")
399
+ FileUtils.touch('/Applications/Google Chrome.app')
400
+ expect(system_adapter)
401
+ .to receive(:run_command)
402
+ .with("open -a 'Google Chrome' https://learn.co/lessons/31322")
403
+
404
+ io = StringIO.new
405
+ opener = LearnOpen::Opener.new("jupyter_lab", "atom", false,
406
+ learn_web_client: learn_web_client,
407
+ git_adapter: git_adapter,
408
+ system_adapter: system_adapter,
409
+ io: io,
410
+ platform: "darwin")
411
+ opener.run
412
+ io.rewind
413
+ expect(io.read).to eq(<<-EOF)
414
+ Looking for lesson...
415
+ Opening Jupyter Lesson...
416
+ EOF
417
+ end
418
+
419
+ it "opens the lab in the browser on linux" do
420
+ expect(system_adapter)
421
+ .to receive(:run_command)
422
+ .with("xdg-open https://learn.co/lessons/31322")
423
+ io = StringIO.new
424
+ opener = LearnOpen::Opener.new("jupyter_lab", "atom", false,
425
+ learn_web_client: learn_web_client,
426
+ git_adapter: git_adapter,
427
+ system_adapter: system_adapter,
428
+ io: io,
429
+ platform: "linux")
430
+ opener.run
431
+ io.rewind
432
+ expect(io.read).to eq(<<-EOF)
433
+ Looking for lesson...
434
+ Opening Jupyter Lesson...
435
+ EOF
436
+ end
437
+ end
438
+ context "Readme" do
439
+ it "does not open readme if on unsupported environment" do
440
+ io = StringIO.new
441
+ opener = LearnOpen::Opener.new("readme", "atom", false,
442
+ learn_web_client: learn_web_client,
443
+ git_adapter: git_adapter,
444
+ environment_vars: {},
445
+ system_adapter: system_adapter,
446
+ io: io,
447
+ platform: "chromeos")
448
+ opener.run
449
+
450
+ io.rewind
451
+ expect(io.read).to eq(<<-EOF)
452
+ Looking for lesson...
453
+ It looks like this lesson is a Readme. Please open it in your browser.
454
+ EOF
455
+ end
456
+
457
+ it "writes to custom_commands_log on IDE" do
458
+ environment = {"CREATED_USER" => "bobby", "IDE_CONTAINER" => "true", "LAB_NAME" => "readme"}
459
+ io = StringIO.new
460
+ home_dir = create_linux_home_dir("bobby")
461
+ opener = LearnOpen::Opener.new("readme", "atom", false,
462
+ learn_web_client: learn_web_client,
463
+ git_adapter: git_adapter,
464
+ environment_vars: environment,
465
+ system_adapter: system_adapter,
466
+ io: io)
467
+ opener.run
468
+
469
+ io.rewind
470
+ expect(io.read).to eq(<<-EOF)
471
+ Looking for lesson...
472
+ Opening readme...
473
+ EOF
474
+ custom_commands_log = File.read("#{home_dir}/.custom_commands.log")
475
+ expect(custom_commands_log).to eq("{\"command\":\"browser_open\",\"url\":\"https://learn.co/lessons/31322\"}\n")
476
+ end
477
+ context "on a mac" do
478
+ it "opens safari by default" do
479
+ io = StringIO.new
480
+ expect(system_adapter)
481
+ .to receive(:run_command)
482
+ .with("open -a Safari https://learn.co/lessons/31322")
483
+
484
+ opener = LearnOpen::Opener.new("readme", "atom", false,
485
+ learn_web_client: learn_web_client,
486
+ git_adapter: git_adapter,
487
+ environment_vars: {},
488
+ system_adapter: system_adapter,
489
+ io: io,
490
+ platform: "darwin")
491
+ opener.run
492
+
493
+ io.rewind
494
+ expect(io.read).to eq(<<-EOF)
495
+ Looking for lesson...
496
+ Opening readme...
497
+ EOF
498
+ end
499
+
500
+ it "opens chrome if it exists" do
501
+ FileUtils.mkdir_p("/Applications")
502
+ FileUtils.touch('/Applications/Google Chrome.app')
503
+ io = StringIO.new
504
+ expect(system_adapter)
505
+ .to receive(:run_command)
506
+ .with("open -a 'Google Chrome' https://learn.co/lessons/31322")
507
+
508
+
509
+ opener = LearnOpen::Opener.new("readme", "atom", false,
510
+ learn_web_client: learn_web_client,
511
+ git_adapter: git_adapter,
512
+ environment_vars: {},
513
+ system_adapter: system_adapter,
514
+ io: io,
515
+ platform: "darwin")
516
+ opener.run
517
+
518
+ io.rewind
519
+ expect(io.read).to eq(<<-EOF)
520
+ Looking for lesson...
521
+ Opening readme...
522
+ EOF
523
+ end
524
+ end
525
+
526
+ context "on linux" do
527
+ it "opens in default brower" do
528
+ io = StringIO.new
529
+ expect(system_adapter)
530
+ .to receive(:run_command)
531
+ .with("xdg-open https://learn.co/lessons/31322")
532
+
533
+
534
+ opener = LearnOpen::Opener.new("readme", "atom", false,
535
+ learn_web_client: learn_web_client,
536
+ git_adapter: git_adapter,
537
+ environment_vars: {},
538
+ system_adapter: system_adapter,
539
+ io: io,
540
+ platform: "linux")
541
+ opener.run
542
+
543
+ io.rewind
544
+ expect(io.read).to eq(<<-EOF)
545
+ Looking for lesson...
546
+ Opening readme...
547
+ EOF
548
+ end
549
+ end
550
+ end
551
+ context "iOS labs" do
552
+ it "fails to open on Linux" do
553
+ io = StringIO.new
554
+
555
+ opener = LearnOpen::Opener.new("ios_lab", "atom", false,
556
+ learn_web_client: learn_web_client,
557
+ git_adapter: git_adapter,
558
+ environment_vars: {"SHELL" => "/usr/local/bin/fish"},
559
+ system_adapter: system_adapter,
560
+ io: io,
561
+ platform: "linux")
562
+ opener.run
563
+
564
+ io.rewind
565
+ expect(io.read).to eq(<<-EOF)
566
+ Looking for lesson...
567
+ You need to be on a Mac to work on iOS lessons.
568
+ EOF
569
+ end
570
+
571
+ it "fails to open on the IDE" do
572
+ environment = {
573
+ "SHELL" => "/usr/local/bin/fish",
574
+ "LAB_NAME" => "ios_lab",
575
+ "CREATED_USER" => "bobby",
576
+ "IDE_CONTAINER" => "true",
577
+ "IDE_VERSION" => "3"
578
+ }
579
+ create_linux_home_dir("bobby")
580
+ io = StringIO.new
581
+
582
+ opener = LearnOpen::Opener.new("ios_lab", "atom", false,
583
+ learn_web_client: learn_web_client,
584
+ git_adapter: git_adapter,
585
+ environment_vars: environment,
586
+ system_adapter: system_adapter,
587
+ io: io,
588
+ platform: "linux")
589
+ opener.run
590
+
591
+ io.rewind
592
+ expect(io.read).to eq(<<-EOF)
593
+ Looking for lesson...
594
+ You need to be on a Mac to work on iOS lessons.
595
+ EOF
596
+ end
597
+
598
+ it "opens xcodeproj if on a mac and it exists" do
599
+ io = StringIO.new
600
+ expect(system_adapter)
601
+ .to receive(:change_context_directory)
602
+ .with("/home/bobby/Development/code/ios_lab")
603
+ expect(system_adapter)
604
+ .to receive(:open_login_shell)
605
+ .with("/usr/local/bin/fish")
606
+ expect(system_adapter)
607
+ .to receive(:run_command)
608
+ .with("cd /home/bobby/Development/code/ios_lab && open *.xcodeproj")
609
+
610
+
611
+ opener = LearnOpen::Opener.new("ios_lab", "atom", false,
612
+ learn_web_client: learn_web_client,
613
+ git_adapter: git_adapter,
614
+ environment_vars: {"SHELL" => "/usr/local/bin/fish"},
615
+ system_adapter: system_adapter,
616
+ io: io,
617
+ platform: "darwin")
618
+ opener.run
619
+
620
+ end
621
+ it "opens xcworkspace if on a mac and it exists" do
622
+ io = StringIO.new
623
+ expect(system_adapter)
624
+ .to receive(:change_context_directory)
625
+ .with("/home/bobby/Development/code/ios_with_workspace_lab")
626
+ expect(system_adapter)
627
+ .to receive(:open_login_shell)
628
+ .with("/usr/local/bin/fish")
629
+ expect(system_adapter)
630
+ .to receive(:run_command)
631
+ .with("cd /home/bobby/Development/code/ios_with_workspace_lab && open *.xcworkspace")
632
+
633
+
634
+ opener = LearnOpen::Opener.new("ios_with_workspace_lab", "atom", false,
635
+ learn_web_client: learn_web_client,
636
+ git_adapter: git_adapter,
637
+ environment_vars: {"SHELL" => "/usr/local/bin/fish"},
638
+ system_adapter: system_adapter,
639
+ io: io,
640
+ platform: "darwin")
641
+ opener.run
642
+
643
+ end
644
+ end
645
+ context "Lab" do
646
+ context "installing dependencies" do
647
+ it "runs bundle install if lab is a ruby lab" do
648
+ allow(system_adapter)
649
+ .to receive_messages(
650
+ open_editor: ["atom", path: "."],
651
+ open_login_shell: ["/usr/local/bin/fish"],
652
+ change_context_directory: ["/home/bobby/Development/code/rails-dynamic-request-lab-cb-000"],
653
+ )
654
+
655
+ expect(system_adapter)
656
+ .to receive(:run_command)
657
+ .with("bundle install")
658
+ opener = LearnOpen::Opener.new("ruby_lab", "atom", false,
659
+ learn_web_client: learn_web_client,
660
+ git_adapter: git_adapter,
661
+ environment_vars: {"SHELL" => "/usr/local/bin/fish"},
662
+ system_adapter: system_adapter,
663
+ io: spy)
664
+ opener.run
665
+ end
666
+
667
+ it "outputs correctly for ruby lab" do
668
+ allow(system_adapter)
669
+ .to receive_messages(
670
+ open_editor: :noop,
671
+ open_login_shell: :noop,
672
+ change_context_directory: :noop,
673
+ run_command: :noop,
674
+ )
675
+
676
+ io = StringIO.new
677
+ opener = LearnOpen::Opener.new("ruby_lab", "atom", false,
678
+ learn_web_client: learn_web_client,
679
+ git_adapter: git_adapter,
680
+ environment_vars: {"SHELL" => "/usr/local/bin/fish"},
681
+ system_adapter: system_adapter,
682
+ io: io)
683
+ opener.run
684
+ io.rewind
685
+ expect(io.read).to eq(<<-EOF)
686
+ Looking for lesson...
687
+ Forking lesson...
688
+ Cloning lesson...
689
+ Opening lesson...
690
+ Bundling...
691
+ Done.
692
+ EOF
693
+ end
694
+
695
+ it "runs pip install if lab is a python lab" do
696
+ expect(system_adapter)
697
+ .to receive(:open_editor)
698
+ .with("atom", path: ".")
699
+
700
+ expect(system_adapter)
701
+ .to receive(:open_login_shell)
702
+ .with("/usr/local/bin/fish")
703
+
704
+ expect(system_adapter)
705
+ .to receive(:change_context_directory)
706
+ .with("/home/bobby/Development/code/python_lab")
707
+
708
+ expect(system_adapter)
709
+ .to receive(:run_command)
710
+ .with("python -m pip install -r requirements.txt")
711
+ opener = LearnOpen::Opener.new("python_lab", "atom", false,
712
+ learn_web_client: learn_web_client,
713
+ git_adapter: git_adapter,
714
+ environment_vars: {"SHELL" => "/usr/local/bin/fish"},
715
+ system_adapter: system_adapter,
716
+ io: spy)
717
+ opener.run
718
+ end
719
+ it "outputs correctly for python lab" do
720
+ allow(system_adapter)
721
+ .to receive_messages(
722
+ open_editor: :noop,
723
+ open_login_shell: :noop,
724
+ change_context_directory: :noop,
725
+ run_command: :noop,
726
+ )
727
+
728
+ io = StringIO.new
729
+ opener = LearnOpen::Opener.new("python_lab", "atom", false,
730
+ learn_web_client: learn_web_client,
731
+ git_adapter: git_adapter,
732
+ environment_vars: {"SHELL" => "/usr/local/bin/fish"},
733
+ system_adapter: system_adapter,
734
+ io: io)
735
+ opener.run
736
+ io.rewind
737
+ expect(io.read).to eq(<<-EOF)
738
+ Looking for lesson...
739
+ Forking lesson...
740
+ Cloning lesson...
741
+ Opening lesson...
742
+ Installing pip dependencies...
743
+ Done.
744
+ EOF
745
+ end
746
+ it "runs npm install if lab is a node lab" do
747
+ expect(system_adapter)
748
+ .to receive(:open_editor)
749
+ .with("atom", path: ".")
750
+
751
+ expect(system_adapter)
752
+ .to receive(:open_login_shell)
753
+ .with("/usr/local/bin/fish")
754
+
755
+ expect(system_adapter)
756
+ .to receive(:change_context_directory)
757
+ .with("/home/bobby/Development/code/node_lab")
758
+
759
+ expect(system_adapter)
760
+ .to receive(:run_command)
761
+ .with("npm install")
762
+ opener = LearnOpen::Opener.new("node_lab", "atom", false,
763
+ learn_web_client: learn_web_client,
764
+ git_adapter: git_adapter,
765
+ environment_vars: {"SHELL" => "/usr/local/bin/fish"},
766
+ system_adapter: system_adapter,
767
+ io: spy)
768
+ opener.run
769
+ end
770
+ it "outputs correctly for node lab" do
771
+ allow(system_adapter)
772
+ .to receive_messages(
773
+ open_editor: :noop,
774
+ open_login_shell: :noop,
775
+ change_context_directory: :noop,
776
+ run_command: :noop,
777
+ )
19
778
 
20
- it "returns false if directory for lab doesn't exists" do
21
- expect(opener).to receive(:repo_dir).and_return("js-rubber-duck-wrangling")
22
- expect(opener.repo_exists?).to be_falsy
779
+ io = StringIO.new
780
+ opener = LearnOpen::Opener.new("node_lab", "atom", false,
781
+ learn_web_client: learn_web_client,
782
+ git_adapter: git_adapter,
783
+ environment_vars: {"SHELL" => "/usr/local/bin/fish"},
784
+ system_adapter: system_adapter,
785
+ io: io)
786
+ opener.run
787
+ io.rewind
788
+ expect(io.read).to eq(<<-EOF)
789
+ Looking for lesson...
790
+ Forking lesson...
791
+ Cloning lesson...
792
+ Opening lesson...
793
+ Installing npm dependencies...
794
+ Done.
795
+ EOF
796
+ end
797
+ end
798
+ end
23
799
  end
24
800
  end
25
- end