pgit 0.0.4 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. checksums.yaml +4 -4
  2. data/.agignore +3 -0
  3. data/.travis.yml +1 -0
  4. data/README.markdown +32 -9
  5. data/Rakefile +12 -0
  6. data/bin/pgit +167 -25
  7. data/lib/pgit.rb +40 -10
  8. data/lib/pgit/bilateral/handle_back.rb +22 -0
  9. data/lib/pgit/bilateral/handle_choose_story.rb +31 -0
  10. data/lib/pgit/bilateral/story.rb +44 -0
  11. data/lib/pgit/command.rb +83 -0
  12. data/lib/pgit/command/add.rb +36 -0
  13. data/lib/pgit/command/application.rb +21 -0
  14. data/lib/pgit/command/edit.rb +36 -0
  15. data/lib/pgit/command/remove.rb +36 -0
  16. data/lib/pgit/command/run.rb +32 -0
  17. data/lib/pgit/command/show.rb +53 -0
  18. data/lib/pgit/configuration.rb +27 -3
  19. data/lib/pgit/current_project.rb +9 -45
  20. data/lib/pgit/current_project/validator.rb +2 -1
  21. data/lib/pgit/error/external.rb +11 -0
  22. data/lib/pgit/error/user.rb +12 -0
  23. data/lib/pgit/helpers/heredoc.rb +17 -0
  24. data/lib/pgit/helpers/query_methods.rb +63 -0
  25. data/lib/pgit/helpers/string_extensions.rb +29 -0
  26. data/lib/pgit/installer/bash_auto_completion.rb +57 -0
  27. data/lib/pgit/pivotal/collection_request.rb +21 -0
  28. data/lib/pgit/pivotal/individual_request.rb +47 -0
  29. data/lib/pgit/pivotal/iteration.rb +6 -0
  30. data/lib/pgit/pivotal/iterations.rb +15 -0
  31. data/lib/pgit/pivotal/project.rb +6 -0
  32. data/lib/pgit/pivotal/projects.rb +20 -0
  33. data/lib/pgit/pivotal/query.rb +8 -0
  34. data/lib/pgit/pivotal/request.rb +33 -0
  35. data/lib/pgit/pivotal/request/query.rb +25 -0
  36. data/lib/pgit/pivotal/story.rb +38 -0
  37. data/lib/pgit/pivotal_request_validator.rb +1 -1
  38. data/lib/pgit/project.rb +78 -0
  39. data/lib/pgit/project/add.rb +28 -0
  40. data/lib/pgit/project/application.rb +21 -0
  41. data/lib/pgit/project/interactive_adder.rb +41 -0
  42. data/lib/pgit/project/remove.rb +41 -0
  43. data/lib/pgit/project/reuse_api_token_adder.rb +48 -0
  44. data/lib/pgit/response_handler.rb +16 -0
  45. data/lib/pgit/root.rb +5 -0
  46. data/lib/pgit/status.rb +16 -0
  47. data/lib/pgit/story_branch/application.rb +3 -3
  48. data/lib/pgit/{name_parser.rb → story_branch/name_parser.rb} +0 -0
  49. data/lib/pgit/story_branch/story_id_parser.rb +11 -0
  50. data/lib/pgit/validators/project_validator.rb +20 -0
  51. data/lib/pgit/version.rb +1 -1
  52. data/lib/pivotal +0 -0
  53. data/pgit.gemspec +5 -0
  54. data/spec/fixtures/iterations +1 -0
  55. data/spec/pgit/bilateral/handle_back_spec.rb +29 -0
  56. data/spec/pgit/bilateral/handle_choose_story_spec.rb +17 -0
  57. data/spec/pgit/bilateral/story_spec.rb +178 -0
  58. data/spec/pgit/command/add_spec.rb +68 -0
  59. data/spec/pgit/command/application_spec.rb +110 -0
  60. data/spec/pgit/command/edit_spec.rb +61 -0
  61. data/spec/pgit/command/remove_spec.rb +76 -0
  62. data/spec/pgit/command/run_spec.rb +49 -0
  63. data/spec/pgit/command/show_spec.rb +95 -0
  64. data/spec/pgit/command_spec.rb +299 -0
  65. data/spec/pgit/configuration_spec.rb +121 -18
  66. data/spec/pgit/current_project/validator_spec.rb +2 -1
  67. data/spec/pgit/current_project_spec.rb +20 -71
  68. data/spec/pgit/{external_error_spec.rb → error/external_spec.rb} +3 -3
  69. data/spec/pgit/error/user_spec.rb +17 -0
  70. data/spec/pgit/helpers/heredoc_spec.rb +33 -0
  71. data/spec/pgit/helpers/query_methods_spec.rb +24 -0
  72. data/spec/pgit/helpers/string_extensions_spec.rb +49 -0
  73. data/spec/pgit/installer/bash_auto_completion_spec.rb +134 -0
  74. data/spec/pgit/pivotal/individual_request_spec.rb +32 -0
  75. data/spec/pgit/pivotal/iteration_spec.rb +19 -0
  76. data/spec/pgit/pivotal/iterations_spec.rb +37 -0
  77. data/spec/pgit/pivotal/project_spec.rb +9 -0
  78. data/spec/pgit/pivotal/projects_spec.rb +48 -0
  79. data/spec/pgit/pivotal/request/query_spec.rb +24 -0
  80. data/spec/pgit/pivotal/story_spec.rb +113 -0
  81. data/spec/pgit/pivotal_request_validator_spec.rb +3 -3
  82. data/spec/pgit/project/add_spec.rb +52 -0
  83. data/spec/pgit/project/application_spec.rb +69 -0
  84. data/spec/pgit/project/interactive_adder_spec.rb +45 -0
  85. data/spec/pgit/project/remove_spec.rb +86 -0
  86. data/spec/pgit/project/reuse_api_token_adder_spec.rb +41 -0
  87. data/spec/pgit/project_spec.rb +513 -0
  88. data/spec/pgit/status_spec.rb +40 -0
  89. data/spec/pgit/story_branch/application_spec.rb +5 -8
  90. data/spec/pgit/story_branch/name_parser_spec.rb +3 -3
  91. data/spec/pgit/story_branch/story_id_parser_spec.rb +17 -0
  92. data/spec/pgit/validators/project_validator_spec.rb +39 -0
  93. metadata +146 -21
  94. data/lib/pgit/configuration/layout_error.rb +0 -9
  95. data/lib/pgit/configuration/missing_attributes_error.rb +0 -10
  96. data/lib/pgit/configuration/not_found_error.rb +0 -10
  97. data/lib/pgit/configuration/project_missing_error.rb +0 -10
  98. data/lib/pgit/configuration/validator.rb +0 -41
  99. data/lib/pgit/current_project/no_paths_match_working_dir_error.rb +0 -10
  100. data/lib/pgit/external_error.rb +0 -9
  101. data/lib/pgit/installer/configuration.rb +0 -34
  102. data/lib/pgit/story.rb +0 -44
  103. data/spec/pgit/configuration/missing_attributes_error_spec.rb +0 -30
  104. data/spec/pgit/configuration/not_found_error_spec.rb +0 -17
  105. data/spec/pgit/configuration/project_missing_error_spec.rb +0 -30
  106. data/spec/pgit/configuration/validator_spec.rb +0 -79
  107. data/spec/pgit/current_project/no_paths_match_working_dir_error_spec.rb +0 -17
  108. data/spec/pgit/installer/configuration_spec.rb +0 -162
  109. data/spec/pgit/story_spec.rb +0 -35
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'PGit::Project::ReuseApiTokenAdder' do
4
+ describe '#execute' do
5
+ describe 'there is already a project in the configuration file' do
6
+ it 'asks the right questions and the responses can be queried properly' do
7
+ api_token = 'someapitoken123'
8
+ path = 'some/path'
9
+ project_in_config = instance_double('PGit::Project',
10
+ api_token: api_token,
11
+ path: path)
12
+ projects = [project_in_config]
13
+ project = instance_double('PGit::Project')
14
+ allow(project).to receive(:api_token=).with(api_token)
15
+
16
+ question1 = instance_double('Interactive::Question', :question= => nil,
17
+ :options= => nil)
18
+ question2 = instance_double('Interactive::Question', :question= => nil,
19
+ :options= => nil)
20
+ reuse_response = double('response', yes?: true)
21
+ which_response = double('response', whole_number?: true, to_i: 0)
22
+ story_1 = double('OpenStruct', api_token: api_token, path: path)
23
+ allow(OpenStruct).to receive(:new).with(api_token: api_token, path: path).and_return(story_1)
24
+ allow(Interactive::Question).to receive(:new).and_yield(question1).and_yield(question2).and_return(question1, question2)
25
+ allow(question1).to receive(:columns=).with [:index, :api_token, :path]
26
+ allow(question2).to receive(:columns=).with [:index, :api_token, :path]
27
+ allow(question1).to receive(:ask_and_wait_for_valid_response).and_yield(reuse_response)
28
+ allow(question2).to receive(:ask_and_wait_for_valid_response).and_yield(which_response)
29
+
30
+ adder = PGit::Project::ReuseApiTokenAdder.new(project, projects)
31
+ adder.execute!
32
+
33
+ expect(question1).to have_received(:question=).with "Do you want to reuse an api token?"
34
+ expect(question1).to have_received(:options=).with [:yes, :no]
35
+ expect(question2).to have_received(:question=).with "Which one?"
36
+ expect(question2).to have_received(:options=).with [[story_1], :cancel]
37
+ expect(question2).to have_received(:columns=).with [:index, :api_token, :path]
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,513 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'PGit::Project' do
4
+ describe 'kind' do
5
+ it 'should give "project"' do
6
+ p = PGit::Project.new
7
+ p.instance_variable_set("@kind", 'project')
8
+
9
+ expect(p.kind).to eq 'project'
10
+ end
11
+ end
12
+
13
+ describe '#given_api_token?' do
14
+ it 'should return false if no api_token given' do
15
+ p = PGit::Project.new
16
+ expect(p).not_to be_given_api_token
17
+ end
18
+
19
+ it 'should return true if api_token is given' do
20
+ proj = PGit::Project.new do |p|
21
+ p.api_token = 'someapitoken'
22
+ end
23
+
24
+ expect(proj).to be_given_api_token
25
+ end
26
+ end
27
+
28
+ describe '#given_id?' do
29
+ it 'should return false if no api_token given' do
30
+ p = PGit::Project.new
31
+ expect(p).not_to be_given_id
32
+ end
33
+
34
+ it 'should return true if api_token is given' do
35
+ proj = PGit::Project.new do |p|
36
+ p.id = 'someid'
37
+ end
38
+ expect(proj).to be_given_id
39
+ end
40
+ end
41
+
42
+ describe '#commands=' do
43
+ it 'sets the commands' do
44
+ command = instance_double('PGit::Command')
45
+ command_name = 'command_name'
46
+ command_steps = ['subcommand1', 'subcommand2']
47
+ new_command = instance_double('PGit::Command', name: command_name,
48
+ steps: command_steps)
49
+ project_hash = { "path" => "/Therapy-Exercises-Online/some_other_project",
50
+ "id" => 12345,
51
+ "api_token" => "astoeuh",
52
+ "commands" => [{'command_name' => command_steps }] }
53
+ allow(PGit::Command).to receive(:new).and_return(command)
54
+ configuration = instance_double('PGit::Configuration')
55
+ proj = PGit::Project.new(configuration, project_hash)
56
+ proj.commands = [new_command]
57
+
58
+ expect(proj.commands.first).to eq new_command
59
+ end
60
+ end
61
+
62
+ describe '#commands' do
63
+ it 'returns the commands if they exist' do
64
+ command = instance_double('PGit::Command')
65
+ command_name = 'command_name'
66
+ command_steps = ['subcommand1', 'subcommand2']
67
+ project_hash = { "path" => "/Therapy-Exercises-Online/some_other_project",
68
+ "id" => 12345,
69
+ "api_token" => "astoeuh",
70
+ "commands" => [{'command_name' => command_steps }] }
71
+ allow(PGit::Command).to receive(:new).and_return(command)
72
+ configuration = instance_double('PGit::Configuration')
73
+ proj = PGit::Project.new(configuration, project_hash)
74
+
75
+ expect(proj.commands.first).to eq command
76
+ end
77
+
78
+ it 'returns empty array if there are no commands' do
79
+ project_hash = { "path" => "/Therapy-Exercises-Online/some_other_project",
80
+ "id" => 12345,
81
+ "api_token" => "astoeuh",
82
+ "commands" => [] }
83
+ configuration = instance_double('PGit::Configuration')
84
+ proj = PGit::Project.new(configuration, project_hash)
85
+
86
+ expect(proj.commands).to eq []
87
+ end
88
+ end
89
+
90
+ describe '#path' do
91
+ it 'returns the path' do
92
+ project_hash = { "path" => "/Therapy-Exercises-Online/some_other_project",
93
+ "id" => 12345,
94
+ "api_token" => "astoeuh",
95
+ "commands" => [] }
96
+ configuration = instance_double('PGit::Configuration')
97
+ proj = PGit::Project.new(configuration, project_hash)
98
+ expect(proj.path).to eq project_hash.fetch('path')
99
+ end
100
+
101
+ it 'defaults to :no_path_given' do
102
+ configuration = instance_double('PGit::Configuration')
103
+ api_token = 's3cret'
104
+ id = 12345
105
+ proj = PGit::Project.new(configuration) do |p|
106
+ p.api_token = api_token
107
+ p.id = id
108
+ end
109
+
110
+ expect(proj.path).to eq :no_path_given
111
+ end
112
+ end
113
+
114
+ describe '#sublink' do
115
+ it 'returns the sublink' do
116
+ project_hash = { "path" => "/Therapy-Exercises-Online/some_other_project",
117
+ "id" => 12345,
118
+ "api_token" => "astoeuh",
119
+ "commands" => [] }
120
+ configuration = instance_double('PGit::Configuration')
121
+ proj = PGit::Project.new(configuration, project_hash)
122
+
123
+ expect(proj.sublink).to eq "projects/#{proj.id}"
124
+ end
125
+ end
126
+
127
+ describe '#api_token' do
128
+ it 'returns the api_token' do
129
+ project_hash = { "path" => "/Therapy-Exercises-Online/some_other_project",
130
+ "id" => 12345,
131
+ "api_token" => "astoeuh",
132
+ "commands" => [] }
133
+ configuration = instance_double('PGit::Configuration')
134
+ proj = PGit::Project.new(configuration, project_hash)
135
+ expect(proj.api_token).to eq project_hash.fetch('api_token')
136
+ end
137
+ end
138
+
139
+ describe '#id' do
140
+ it 'returns the id' do
141
+ project_hash = { "path" => "/Therapy-Exercises-Online/some_other_project",
142
+ "id" => 12345,
143
+ "api_token" => "astoeuh",
144
+ "commands" => [] }
145
+ configuration = instance_double('PGit::Configuration')
146
+ proj = PGit::Project.new(configuration, project_hash)
147
+ expect(proj.id).to eq project_hash.fetch('id')
148
+ end
149
+ end
150
+
151
+ describe '#has_path?(path)' do
152
+ it 'returns true if the paths are the same' do
153
+ project_hash = { "path" => "/Therapy-Exercises-Online/some_other_project",
154
+ "id" => 12345,
155
+ "api_token" => "astoeuh",
156
+ "commands" => [] }
157
+ configuration = instance_double('PGit::Configuration')
158
+ proj = PGit::Project.new(configuration, project_hash)
159
+
160
+ expect(proj).to be_has_path(project_hash.fetch('path'))
161
+ end
162
+
163
+ it 'returns false if the paths are not the same' do
164
+ project_hash = { "path" => "/Therapy-Exercises-Online/some_other_project",
165
+ "id" => 12345,
166
+ "api_token" => "astoeuh",
167
+ "commands" => [] }
168
+ configuration = instance_double('PGit::Configuration')
169
+ proj = PGit::Project.new(configuration, project_hash)
170
+
171
+ expect(proj).not_to be_has_path('some/other/path')
172
+ end
173
+ end
174
+
175
+ describe '#has_api_token?(api_token)' do
176
+ it 'returns true if the api_tokens are the same' do
177
+ project_hash = { "path" => "/Therapy-Exercises-Online/some_other_project",
178
+ "id" => 12345,
179
+ "api_token" => "astoeuh",
180
+ "commands" => [] }
181
+ configuration = instance_double('PGit::Configuration')
182
+ proj = PGit::Project.new(configuration, project_hash)
183
+
184
+ expect(proj).to be_has_api_token(project_hash.fetch('api_token'))
185
+ end
186
+
187
+ it 'returns false if the api_tokens are not the same' do
188
+ project_hash = { "path" => "/Therapy-Exercises-Online/some_other_project",
189
+ "id" => 12345,
190
+ "api_token" => "astoeuh",
191
+ "commands" => [] }
192
+ configuration = instance_double('PGit::Configuration')
193
+ proj = PGit::Project.new(configuration, project_hash)
194
+
195
+ expect(proj).not_to be_has_api_token('some/other/api_token')
196
+ end
197
+ end
198
+
199
+ describe '#has_id?(id)' do
200
+ it 'returns true if the ids are the same' do
201
+ project_hash = { "path" => "/Therapy-Exercises-Online/some_other_project",
202
+ "id" => 12345,
203
+ "api_token" => "astoeuh",
204
+ "commands" => [] }
205
+ configuration = instance_double('PGit::Configuration')
206
+ proj = PGit::Project.new(configuration, project_hash)
207
+
208
+ expect(proj).to be_has_id(project_hash.fetch('id'))
209
+ end
210
+
211
+ it 'returns false if the ids are not the same' do
212
+ project_hash = { "path" => "/Therapy-Exercises-Online/some_other_project",
213
+ "id" => 12345,
214
+ "api_token" => "astoeuh",
215
+ "commands" => [] }
216
+ configuration = instance_double('PGit::Configuration')
217
+ proj = PGit::Project.new(configuration, project_hash)
218
+
219
+ expect(proj).not_to be_has_id(54321)
220
+ end
221
+ end
222
+
223
+ describe 'instatiating with a block' do
224
+ it 'sets the api_token, path, id based on the block' do
225
+ path = '/some/path'
226
+ api_token = 's3cret'
227
+ id = 12345
228
+ commands = []
229
+ configuration = instance_double('PGit::Configuration')
230
+
231
+ proj = PGit::Project.new(configuration) do |p|
232
+ p.path = path
233
+ p.api_token = api_token
234
+ p.id = id
235
+ p.commands = commands
236
+ end
237
+
238
+ expect(proj.path).to eq path
239
+ expect(proj.api_token).to eq api_token
240
+ expect(proj.id).to eq id
241
+ expect(proj.commands).to eq commands
242
+ end
243
+ end
244
+
245
+ describe '#to_hash' do
246
+ it 'returns the hash version' do
247
+ command = "command1"
248
+ steps = ["step1", "step2"]
249
+ command_hash = { command => steps }
250
+ project_hash = { "path" => "/Therapy-Exercises-Online/some_other_project",
251
+ "id" => 12345,
252
+ "api_token" => "astoeuh",
253
+ "commands" => [
254
+ command_hash
255
+ ]
256
+ }
257
+ fake_command = instance_double('PGit::Command', to_hash: command_hash)
258
+ configuration = instance_double('PGit::Configuration')
259
+ proj = PGit::Project.new(configuration, project_hash)
260
+
261
+ expect(proj.to_hash).to eq project_hash
262
+ end
263
+ end
264
+
265
+ describe '#save!' do
266
+ it 'saves the project if does not exist' do
267
+ projects = []
268
+ configuration = instance_double('PGit::Configuration',
269
+ projects: projects,
270
+ "projects=".to_sym => :success,
271
+ save!: :successful_save)
272
+ command = "command1"
273
+ steps = ["step1", "step2"]
274
+ command_hash = { command => steps }
275
+ new_project = instance_double('PGit::Project',
276
+ 'path'=>"/Therapy-Exercises-Online/some_other_project",
277
+ 'id'=> 54321,
278
+ 'api_token'=> 'astoeuh',
279
+ 'commands'=> [command_hash])
280
+
281
+ new_projs = [new_project]
282
+ allow(configuration).to receive(:projects=).with(new_projs)
283
+
284
+ proj = PGit::Project.new(configuration) do |p|
285
+ p.path = new_project.path
286
+ p.api_token = new_project.api_token
287
+ p.id = 54321
288
+ end
289
+
290
+ allow(proj).to receive(:valid?).and_return(true)
291
+ proj.save!
292
+
293
+ expect(configuration).to have_received(:save!)
294
+ expect(configuration.projects.first.path).to eq proj.path
295
+ expect(configuration.projects.first.id).to eq 54321
296
+ expect(configuration.projects.size).to eq 1
297
+ end
298
+
299
+ it 'replaces the old copy of the project' do
300
+ command = "command1"
301
+ steps = ["step1", "step2"]
302
+ command_hash = { command => steps }
303
+ old_project = instance_double('PGit::Project',
304
+ 'path'=>"/Therapy-Exercises-Online/some_other_project",
305
+ 'id'=> 12345,
306
+ 'api_token'=> 'astoeuh',
307
+ 'commands'=> [command_hash])
308
+ new_project = instance_double('PGit::Project',
309
+ 'path'=>"/Therapy-Exercises-Online/some_other_project",
310
+ 'id'=> 54321,
311
+ 'api_token'=> 'astoeuh',
312
+ 'commands'=> [command_hash])
313
+
314
+ projects = [old_project]
315
+
316
+ class SomeConfig
317
+ def initialize(fake_proj)
318
+ @projs = [] << fake_proj
319
+ end
320
+
321
+ def projects
322
+ @projs
323
+ end
324
+
325
+ def projects=(projArr)
326
+ @projs = projArr
327
+ end
328
+
329
+ def save!
330
+ end
331
+ end
332
+
333
+ configuration = SomeConfig.new(old_project)
334
+ allow(configuration).to receive(:save!)
335
+
336
+ proj = PGit::Project.new(configuration) do |p|
337
+ p.path = old_project.path
338
+ p.api_token = old_project.api_token
339
+ p.id = 54321
340
+ end
341
+
342
+ allow(proj).to receive(:valid?).and_return(true)
343
+ proj.save!
344
+
345
+ expect(configuration).to have_received(:save!)
346
+ expect(configuration.projects.first.path).to eq proj.path
347
+ expect(configuration.projects.first.id).to eq 54321
348
+ expect(configuration.projects.size).to eq 1
349
+ end
350
+
351
+ it 'raises an error if id does not exist' do
352
+ command = "command1"
353
+ steps = ["step1", "step2"]
354
+ command_hash = { command => steps }
355
+ old_project = instance_double('PGit::Project',
356
+ 'path'=>"/Therapy-Exercises-Online/some_other_project",
357
+ 'id'=> 12345,
358
+ 'api_token'=> 'astoeuh',
359
+ 'commands'=> [command_hash])
360
+ new_project = instance_double('PGit::Project',
361
+ 'path'=>"/Therapy-Exercises-Online/some_other_project",
362
+ 'id'=> 54321,
363
+ 'api_token'=> 'astoeuh',
364
+ 'commands'=> [command_hash])
365
+
366
+ projects = [old_project]
367
+ configuration = instance_double('PGit::Configuration',
368
+ projects: projects,
369
+ "projects=".to_sym => :success,
370
+ save!: :successful_save)
371
+
372
+ new_projs = [new_project]
373
+ allow(configuration).to receive(:projects=).with(new_projs)
374
+
375
+ proj = PGit::Project.new(configuration) do |p|
376
+ p.path = old_project.path
377
+ p.api_token = old_project.api_token
378
+ end
379
+
380
+ expect{proj.save!}.to raise_error(PGit::Error::User, 'no_id_given')
381
+ end
382
+
383
+ it 'raises an error if api_token does not exist' do
384
+ command = "command1"
385
+ steps = ["step1", "step2"]
386
+ command_hash = { command => steps }
387
+ old_project = instance_double('PGit::Project',
388
+ 'path'=>"/Therapy-Exercises-Online/some_other_project",
389
+ 'id'=> 12345,
390
+ 'api_token'=> 'astoeuh',
391
+ 'commands'=> [command_hash])
392
+ new_project = instance_double('PGit::Project',
393
+ 'path'=>"/Therapy-Exercises-Online/some_other_project",
394
+ 'id'=> 54321,
395
+ 'api_token'=> 'astoeuh',
396
+ 'commands'=> [command_hash])
397
+
398
+ projects = [old_project]
399
+ configuration = instance_double('PGit::Configuration',
400
+ projects: projects,
401
+ "projects=".to_sym => :success,
402
+ save!: :successful_save)
403
+
404
+ new_projs = [new_project]
405
+ allow(configuration).to receive(:projects=).with(new_projs)
406
+
407
+ proj = PGit::Project.new(configuration) do |p|
408
+ p.path = old_project.path
409
+ p.id = old_project.id
410
+ end
411
+
412
+ expect{proj.save!}.to raise_error(PGit::Error::User, 'no_api_token_given')
413
+ end
414
+
415
+ it 'raises an error if path does not exist' do
416
+ command = "command1"
417
+ steps = ["step1", "step2"]
418
+ command_hash = { command => steps }
419
+ old_project = instance_double('PGit::Project',
420
+ 'path'=>"/Therapy-Exercises-Online/some_other_project",
421
+ 'id'=> 12345,
422
+ 'api_token'=> 'astoeuh',
423
+ 'commands'=> [command_hash])
424
+ new_project = instance_double('PGit::Project',
425
+ 'path'=>"/Therapy-Exercises-Online/some_other_project",
426
+ 'id'=> 54321,
427
+ 'api_token'=> 'astoeuh',
428
+ 'commands'=> [command_hash])
429
+
430
+ projects = [old_project]
431
+ configuration = instance_double('PGit::Configuration',
432
+ projects: projects,
433
+ "projects=".to_sym => :success,
434
+ save!: :successful_save)
435
+
436
+ new_projs = [new_project]
437
+ allow(configuration).to receive(:projects=).with(new_projs)
438
+
439
+ proj = PGit::Project.new(configuration) do |p|
440
+ p.id = old_project.id
441
+ p.api_token = old_project.api_token
442
+ end
443
+
444
+ expect{proj.save!}.to raise_error(PGit::Error::User, 'no_path_given')
445
+ end
446
+ end
447
+
448
+ describe '#remove!' do
449
+ it 'removes the project' do
450
+ matching_path = "/Therapy-Exercises-Online/some_other_project"
451
+ project_hash = { "path" => matching_path,
452
+ "id" => 12345,
453
+ "api_token" => "astoeuh",
454
+ "commands" => [] }
455
+ project = instance_double('PGit::Project', path: matching_path)
456
+
457
+ class SomeConfig
458
+ def initialize(fake_proj)
459
+ @projs = [] << fake_proj
460
+ end
461
+
462
+ def projects
463
+ @projs
464
+ end
465
+
466
+ def projects=(projArr)
467
+ @projs = projArr
468
+ end
469
+
470
+ def save!
471
+ end
472
+ end
473
+
474
+ configuration = SomeConfig.new(project)
475
+ allow(configuration).to receive(:save!)
476
+ proj = PGit::Project.new(configuration, project_hash)
477
+
478
+ proj.remove!
479
+
480
+ expect(configuration.projects.size).to eq 0
481
+ end
482
+ end
483
+
484
+ describe '#exists?' do
485
+ it 'returns true if it is already in the configuration' do
486
+ matching_path = "/Therapy-Exercises-Online/some_other_project"
487
+ project = instance_double('PGit::Project', path: matching_path)
488
+ projects = [project]
489
+ configuration = instance_double('PGit::Configuration',
490
+ projects: projects,
491
+ save!: true)
492
+ proj = PGit::Project.new(configuration) do |p|
493
+ p.path = matching_path
494
+ end
495
+
496
+ expect(proj).to be_exists
497
+ end
498
+
499
+ it 'returns false if it is not in the configuration' do
500
+ matching_path = "/Therapy-Exercises-Online/some_other_project"
501
+ project = instance_double('PGit::Project', path: matching_path)
502
+ projects = [project]
503
+ configuration = instance_double('PGit::Configuration',
504
+ projects: projects,
505
+ save!: true)
506
+ proj = PGit::Project.new(configuration) do |p|
507
+ p.path = '/some/non-matching/path'
508
+ end
509
+
510
+ expect(proj).not_to be_exists
511
+ end
512
+ end
513
+ end