tracker-application 0.0.1

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 (35) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/Gemfile +3 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +29 -0
  6. data/Rakefile +1 -0
  7. data/lib/tracker/application/create_story.rb +17 -0
  8. data/lib/tracker/application/create_story_story.rb +33 -0
  9. data/lib/tracker/application/load_blocked_stories.rb +21 -0
  10. data/lib/tracker/application/load_closed_stories.rb +15 -0
  11. data/lib/tracker/application/load_epic_stories.rb +24 -0
  12. data/lib/tracker/application/load_finished_stories.rb +21 -0
  13. data/lib/tracker/application/load_started_stories.rb +21 -0
  14. data/lib/tracker/application/load_story.rb +17 -0
  15. data/lib/tracker/application/load_story_child_story_stories.rb +25 -0
  16. data/lib/tracker/application/load_story_parent_story_stories.rb +25 -0
  17. data/lib/tracker/application/load_story_story.rb +21 -0
  18. data/lib/tracker/application/load_unblocked_stories.rb +21 -0
  19. data/lib/tracker/application/version.rb +5 -0
  20. data/lib/tracker/application.rb +19 -0
  21. data/spec/create_story_spec.rb +14 -0
  22. data/spec/create_story_story_spec.rb +87 -0
  23. data/spec/load_blocked_stories_spec.rb +35 -0
  24. data/spec/load_closed_stories_spec.rb +41 -0
  25. data/spec/load_epic_stories_spec.rb +41 -0
  26. data/spec/load_finished_stories_spec.rb +42 -0
  27. data/spec/load_started_stories_spec.rb +43 -0
  28. data/spec/load_story_child_story_stories_spec.rb +34 -0
  29. data/spec/load_story_parent_story_stories_spec.rb +34 -0
  30. data/spec/load_story_spec.rb +14 -0
  31. data/spec/load_story_story_spec.rb +40 -0
  32. data/spec/load_unblocked_stories_spec.rb +35 -0
  33. data/spec/spec_helper.rb +15 -0
  34. data/tracker-application.gemspec +29 -0
  35. metadata +188 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 0ae01d21e9f6848e4dda0d3940fc00bb0f1df3a0
4
+ data.tar.gz: ec2a9ae3d1feee84a36c060dd9b824bcca723133
5
+ SHA512:
6
+ metadata.gz: 6677cbad68c60cd7777a13ddf1d1119ca090e60bd476a1723caf3cde4bef86d4bfd6b61f7bae8a7bd75f89594f79dadcd9f94bebb70bac4fdfc6e2222a6a0b09
7
+ data.tar.gz: 06d0791d7c85f11ce19550285d7711026a1ffed015b3165a8843b25f5c84770284ee5b2f8b03c09b786a5505977d1c5231c9bebb825fc411d984e2f46c946f3b
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Ben Bergstein
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # Tracker::Application
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'tracker-application'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install tracker-application
18
+
19
+ ## Usage
20
+
21
+ TODO: Write usage instructions here
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,17 @@
1
+ require 'interactor'
2
+
3
+ module Tracker
4
+ module Application
5
+ class CreateStory
6
+ include Interactor
7
+
8
+ def perform
9
+ title = context[:title]
10
+
11
+ story_id = Tracker.pg[:stories].insert(title: title)
12
+
13
+ context[:story_id] = story_id
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,33 @@
1
+ require 'interactor'
2
+
3
+ module Tracker
4
+ module Application
5
+ class CreateStoryStory
6
+ include Interactor
7
+
8
+ def perform
9
+ child_story_id = context[:child_story_id]
10
+ parent_story_id = context[:parent_story_id]
11
+
12
+ story_story_attributes = {
13
+ parent_story_id: parent_story_id,
14
+ child_story_id: child_story_id
15
+ }
16
+
17
+ recursive_sql = Tracker::PG.recursive_parent_story_stories_sql(parent_story_id)
18
+
19
+ invalid_story_stories = Tracker.pg[:story_stories].where("id in (#{recursive_sql})").where(
20
+ parent_story_id: child_story_id
21
+ )
22
+
23
+ if Tracker.pg[:story_stories].where(story_story_attributes).any?
24
+ fail!(message: :already_exists)
25
+ else
26
+ invalid_story_stories.delete
27
+ story_story_id = Tracker.pg[:story_stories].insert(story_story_attributes)
28
+ context[:story_story_id] = story_story_id
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,21 @@
1
+ require 'interactor'
2
+
3
+ module Tracker
4
+ module Application
5
+ class LoadBlockedStories
6
+ include Interactor
7
+
8
+ def perform
9
+ blocked_stories = Tracker.pg[:stories].where(where_sql_statement)
10
+
11
+ context[:blocked_stories] = blocked_stories
12
+ end
13
+
14
+ private
15
+
16
+ def where_sql_statement
17
+ '(select count(id) from story_stories where story_stories.parent_story_id = stories.id) > 0'
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,15 @@
1
+ require 'interactor'
2
+
3
+ module Tracker
4
+ module Application
5
+ class LoadClosedStories
6
+ include Interactor
7
+
8
+ def perform
9
+ closed_stories = Tracker.pg[:stories].where('closed_at IS NOT NULL')
10
+
11
+ context[:closed_stories] = closed_stories
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,24 @@
1
+ require 'interactor'
2
+
3
+ module Tracker
4
+ module Application
5
+ class LoadEpicStories
6
+ include Interactor
7
+
8
+ def perform
9
+ epic_stories = Tracker.pg[:stories].where(where_sql_statement)
10
+
11
+ context[:epic_stories] = epic_stories
12
+ end
13
+
14
+ private
15
+
16
+ def where_sql_statement
17
+ '%s AND %s' % [
18
+ '(SELECT COUNT(id) FROM story_stories WHERE story_stories.parent_story_id = stories.id) > 0',
19
+ '(SELECT COUNT(id) FROM story_stories WHERE story_stories.child_story_id = stories.id) = 0'
20
+ ]
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,21 @@
1
+ require 'interactor'
2
+
3
+ module Tracker
4
+ module Application
5
+ class LoadFinishedStories
6
+ include Interactor
7
+
8
+ def perform
9
+ finished_stories = Tracker.pg[:stories].where(where_sql_statement)
10
+
11
+ context[:finished_stories] = finished_stories
12
+ end
13
+
14
+ private
15
+
16
+ def where_sql_statement
17
+ 'finished_at IS NOT NULL AND closed_at IS NULL'
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ require 'interactor'
2
+
3
+ module Tracker
4
+ module Application
5
+ class LoadStartedStories
6
+ include Interactor
7
+
8
+ def perform
9
+ started_stories = Tracker.pg[:stories].where(where_sql_statement)
10
+
11
+ context[:started_stories] = started_stories
12
+ end
13
+
14
+ private
15
+
16
+ def where_sql_statement
17
+ 'started_at IS NOT NULL AND finished_at IS NULL AND closed_at IS NULL'
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,17 @@
1
+ require 'interactor'
2
+
3
+ module Tracker
4
+ module Application
5
+ class LoadStory
6
+ include Interactor
7
+
8
+ def perform
9
+ story_id = context[:story_id]
10
+
11
+ story = Tracker.pg[:stories][id: story_id]
12
+
13
+ context[:story] = story
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,25 @@
1
+ require 'interactor'
2
+
3
+ module Tracker
4
+ module Application
5
+ class LoadStoryChildStoryStories
6
+ include Interactor
7
+
8
+ def perform
9
+ story_id = context[:story_id]
10
+
11
+ child_story_stories = Tracker.pg[:story_stories]
12
+ .where(parent_story_id: story_id)
13
+ .join(:stories, id: :child_story_id)
14
+ .select(
15
+ :story_stories__id,
16
+ :story_stories__parent_story_id,
17
+ :story_stories__child_story_id,
18
+ :stories__title___child_story_title
19
+ )
20
+
21
+ context[:child_story_stories] = child_story_stories
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ require 'interactor'
2
+
3
+ module Tracker
4
+ module Application
5
+ class LoadStoryParentStoryStories
6
+ include Interactor
7
+
8
+ def perform
9
+ story_id = context[:story_id]
10
+
11
+ parent_story_stories = Tracker.pg[:story_stories]
12
+ .where(child_story_id: story_id)
13
+ .join(:stories, id: :parent_story_id)
14
+ .select(
15
+ :story_stories__id,
16
+ :story_stories__parent_story_id,
17
+ :story_stories__child_story_id,
18
+ :stories__title___parent_story_title
19
+ )
20
+
21
+ context[:parent_story_stories] = parent_story_stories
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,21 @@
1
+ require 'interactor'
2
+
3
+ module Tracker
4
+ module Application
5
+ class LoadStoryStory
6
+ include Interactor
7
+
8
+ def perform
9
+ parent_story_id = context[:parent_story_id]
10
+ child_story_id = context[:child_story_id]
11
+
12
+ story_story = Tracker.pg[:story_stories][
13
+ parent_story_id: parent_story_id,
14
+ child_story_id: child_story_id
15
+ ]
16
+
17
+ context[:story_story] = story_story
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ require 'interactor'
2
+
3
+ module Tracker
4
+ module Application
5
+ class LoadUnblockedStories
6
+ include Interactor
7
+
8
+ def perform
9
+ unblocked_stories = Tracker.pg[:stories].where(where_sql_statement)
10
+
11
+ context[:unblocked_stories] = unblocked_stories
12
+ end
13
+
14
+ private
15
+
16
+ def where_sql_statement
17
+ '(select count(id) from story_stories where story_stories.parent_story_id = stories.id) = 0'
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,5 @@
1
+ module Tracker
2
+ module Application
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
@@ -0,0 +1,19 @@
1
+ require "tracker/application/version"
2
+ require "tracker/application/create_story"
3
+ require "tracker/application/create_story_story"
4
+ require "tracker/application/load_story"
5
+ require "tracker/application/load_story_story"
6
+ require "tracker/application/load_unblocked_stories"
7
+ require "tracker/application/load_blocked_stories"
8
+ require "tracker/application/load_story_parent_story_stories"
9
+ require "tracker/application/load_story_child_story_stories"
10
+ require "tracker/application/load_epic_stories"
11
+ require "tracker/application/load_started_stories"
12
+ require "tracker/application/load_finished_stories"
13
+ require "tracker/application/load_closed_stories"
14
+ require "tracker/application/recursively_load_story_parent_stories"
15
+
16
+ module Tracker
17
+ module Application
18
+ end
19
+ end
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+
3
+ module Tracker
4
+ module Application
5
+ describe CreateStory do
6
+ subject(:result) { CreateStory.perform(title: 'My title') }
7
+
8
+ it 'creates a story' do
9
+ expect(->{subject}).to change{Tracker.pg[:stories].count}.by(1)
10
+ expect(result.story_id).to eq Tracker.pg[:stories].where(title: 'My title').first[:id]
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,87 @@
1
+ require 'spec_helper'
2
+
3
+ module Tracker
4
+ module Application
5
+ describe CreateStoryStory do
6
+ let(:parent_story_id) { Tracker.pg[:stories].insert(title: 'Parent story') }
7
+ let(:child_story_id) { Tracker.pg[:stories].insert(title: 'Child story') }
8
+
9
+ subject(:result) do
10
+ CreateStoryStory.perform(
11
+ parent_story_id: parent_story_id,
12
+ child_story_id: child_story_id
13
+ )
14
+ end
15
+
16
+ let(:new_story_story) do
17
+ Tracker.pg[:story_stories].first(
18
+ parent_story_id: parent_story_id,
19
+ child_story_id: child_story_id
20
+ )
21
+ end
22
+
23
+ it 'creates a story story' do
24
+ expect(->{subject}).to change{Tracker.pg[:story_stories].count}.by(1)
25
+ end
26
+
27
+ it 'is successful' do
28
+ expect(result).to be_success
29
+ end
30
+
31
+ it 'includes the id of the new story story in the result' do
32
+ expect(result.story_story_id).to eq new_story_story[:id]
33
+ end
34
+
35
+ context 'when the story story already exists' do
36
+ before do
37
+ attributes = {
38
+ parent_story_id: parent_story_id,
39
+ child_story_id: child_story_id
40
+ }
41
+
42
+ Tracker.pg[:story_stories].insert(attributes)
43
+ end
44
+
45
+ it 'does not create a story story' do
46
+ expect(->{subject}).not_to change{Tracker.pg[:story_stories].count}.by(1)
47
+ end
48
+
49
+ it 'includes a message in the result' do
50
+ expect(result.message).to eq :already_exists
51
+ end
52
+
53
+ it 'is not successful' do
54
+ expect(result).not_to be_success
55
+ end
56
+ end
57
+
58
+ context 'when the child story is the parent story of a story that is the parent to the parent story' do
59
+ let!(:parent_parent_story_id) do
60
+ Tracker.pg[:stories].insert(title: 'Parent story story')
61
+ end
62
+
63
+ let!(:parent_parent_story_story_id) do
64
+ Tracker.pg[:story_stories].insert(
65
+ child_story_id: parent_story_id,
66
+ parent_story_id: parent_parent_story_id
67
+ )
68
+ end
69
+
70
+ let!(:parent_parent_parent_story_id) do
71
+ Tracker.pg[:story_stories].insert(
72
+ child_story_id: parent_parent_story_id,
73
+ parent_story_id: child_story_id
74
+ )
75
+ endx
76
+
77
+ it 'deletes parent_parent_parent_story_id' do
78
+ expect(->{subject}).to change{Tracker.pg[:story_stories][id: parent_parent_parent_story_id]}.from(
79
+ id: parent_parent_parent_story_id,
80
+ child_story_id: parent_parent_story_id,
81
+ parent_story_id: child_story_id
82
+ ).to(nil)
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ module Tracker
4
+ module Application
5
+ describe LoadBlockedStories do
6
+ let(:unblocked_story_id){Tracker.pg[:stories].insert(title: 'Unblocked story')}
7
+ let(:blocked_story_id){Tracker.pg[:stories].insert(title: 'Blocked story')}
8
+
9
+ before do
10
+ CreateStoryStory.perform(
11
+ parent_story_id: blocked_story_id,
12
+ child_story_id: unblocked_story_id
13
+ )
14
+ end
15
+
16
+ subject(:result) { LoadBlockedStories.perform }
17
+
18
+ it 'is successful' do
19
+ expect(result).to be_success
20
+ end
21
+
22
+ it 'includes the blocked story and not the unblocked story' do
23
+ expect(result.blocked_stories.all).to eq [
24
+ {
25
+ id: blocked_story_id,
26
+ title: 'Blocked story',
27
+ started_at: nil,
28
+ finished_at: nil,
29
+ closed_at: nil
30
+ }
31
+ ]
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ module Tracker
4
+ module Application
5
+ describe LoadClosedStories do
6
+ let!(:closed_story_id){Tracker.pg[:stories].insert(title: 'Closed story', closed_at: closed_at)}
7
+ let(:closed_at){Time.new}
8
+
9
+ before do
10
+ Tracker.pg[:stories].insert(
11
+ title: 'Started story',
12
+ started_at: Time.new
13
+ )
14
+
15
+ Tracker.pg[:stories].insert(
16
+ title: 'Finished story',
17
+ started_at: Time.new,
18
+ finished_at: Time.new
19
+ )
20
+ end
21
+
22
+ subject(:result){LoadClosedStories.perform}
23
+
24
+ it 'is successful' do
25
+ expect(result).to be_success
26
+ end
27
+
28
+ it 'includes only the closed story' do
29
+ expect(result.closed_stories.all).to eq [
30
+ {
31
+ id: closed_story_id,
32
+ title: 'Closed story',
33
+ started_at: nil,
34
+ finished_at: nil,
35
+ closed_at: closed_at
36
+ }
37
+ ]
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ module Tracker
4
+ module Application
5
+ describe LoadEpicStories do
6
+ let(:unblocked_story_id){Tracker.pg[:stories].insert(title: 'Unblocked story')}
7
+ let(:blocked_story_id){Tracker.pg[:stories].insert(title: 'Blocked story')}
8
+ let(:epic_story_id){Tracker.pg[:stories].insert(title: 'Epic story')}
9
+
10
+ before do
11
+ CreateStoryStory.perform(
12
+ parent_story_id: blocked_story_id,
13
+ child_story_id: unblocked_story_id
14
+ )
15
+
16
+ CreateStoryStory.perform(
17
+ parent_story_id: epic_story_id,
18
+ child_story_id: blocked_story_id
19
+ )
20
+ end
21
+
22
+ subject(:result) { LoadEpicStories.perform }
23
+
24
+ it 'is successful' do
25
+ expect(result).to be_success
26
+ end
27
+
28
+ it 'includes only the epic story' do
29
+ expect(result.epic_stories.all).to eq [
30
+ {
31
+ id: epic_story_id,
32
+ title: 'Epic story',
33
+ started_at: nil,
34
+ finished_at: nil,
35
+ closed_at: nil
36
+ }
37
+ ]
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+
3
+ module Tracker
4
+ module Application
5
+ describe LoadFinishedStories do
6
+ let!(:finished_story_id){Tracker.pg[:stories].insert(title: 'Finished story', finished_at: finished_at)}
7
+ let(:finished_at){Time.new}
8
+
9
+ before do
10
+ Tracker.pg[:stories].insert(
11
+ title: 'Started story',
12
+ started_at: Time.new
13
+ )
14
+
15
+ Tracker.pg[:stories].insert(
16
+ title: 'Closed story',
17
+ started_at: Time.new,
18
+ finished_at: Time.new,
19
+ closed_at: Time.new
20
+ )
21
+ end
22
+
23
+ subject(:result){LoadFinishedStories.perform}
24
+
25
+ it 'is successful' do
26
+ expect(result).to be_success
27
+ end
28
+
29
+ it 'includes only the finished story' do
30
+ expect(result.finished_stories.all).to eq [
31
+ {
32
+ id: finished_story_id,
33
+ title: 'Finished story',
34
+ started_at: nil,
35
+ finished_at: finished_at,
36
+ closed_at: nil
37
+ }
38
+ ]
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+
3
+ module Tracker
4
+ module Application
5
+ describe LoadStartedStories do
6
+ let!(:started_story_id){Tracker.pg[:stories].insert(title: 'Started story', started_at: started_at)}
7
+ let(:started_at){Time.new}
8
+
9
+ before do
10
+ Tracker.pg[:stories].insert(
11
+ title: 'Finished story',
12
+ started_at: started_at,
13
+ finished_at: Time.new
14
+ )
15
+
16
+ Tracker.pg[:stories].insert(
17
+ title: 'Closed story',
18
+ started_at: started_at,
19
+ finished_at: Time.new,
20
+ closed_at: Time.new
21
+ )
22
+ end
23
+
24
+ subject(:result){LoadStartedStories.perform}
25
+
26
+ it 'is successful' do
27
+ expect(result).to be_success
28
+ end
29
+
30
+ it 'includes only the started story' do
31
+ expect(result.started_stories.all).to eq [
32
+ {
33
+ id: started_story_id,
34
+ title: 'Started story',
35
+ started_at: started_at,
36
+ finished_at: nil,
37
+ closed_at: nil
38
+ }
39
+ ]
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+
3
+ module Tracker
4
+ module Application
5
+ describe LoadStoryChildStoryStories do
6
+ let(:unblocked_story_id){Tracker.pg[:stories].insert(title: 'Unblocked story')}
7
+ let(:blocked_story_id){Tracker.pg[:stories].insert(title: 'Blocked story')}
8
+
9
+ let!(:parent_story_story_id) do
10
+ result = Tracker.pg[:story_stories].insert(
11
+ parent_story_id: blocked_story_id,
12
+ child_story_id: unblocked_story_id
13
+ )
14
+ end
15
+
16
+ subject(:result) { LoadStoryChildStoryStories.perform(story_id: blocked_story_id) }
17
+
18
+ it 'is successful' do
19
+ expect(result).to be_success
20
+ end
21
+
22
+ it 'includes the only the parent story' do
23
+ expect(result.child_story_stories.all).to eq [
24
+ {
25
+ id: parent_story_story_id,
26
+ parent_story_id: blocked_story_id,
27
+ child_story_id: unblocked_story_id,
28
+ child_story_title: 'Unblocked story'
29
+ }
30
+ ]
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+
3
+ module Tracker
4
+ module Application
5
+ describe LoadStoryParentStoryStories do
6
+ let(:unblocked_story_id){Tracker.pg[:stories].insert(title: 'Unblocked story')}
7
+ let(:blocked_story_id){Tracker.pg[:stories].insert(title: 'Blocked story')}
8
+
9
+ let!(:parent_story_story_id) do
10
+ result = Tracker.pg[:story_stories].insert(
11
+ parent_story_id: blocked_story_id,
12
+ child_story_id: unblocked_story_id
13
+ )
14
+ end
15
+
16
+ subject(:result) { LoadStoryParentStoryStories.perform(story_id: unblocked_story_id) }
17
+
18
+ it 'is successful' do
19
+ expect(result).to be_success
20
+ end
21
+
22
+ it 'includes the only the parent story' do
23
+ expect(result.parent_story_stories.all).to eq [
24
+ {
25
+ id: parent_story_story_id,
26
+ parent_story_id: blocked_story_id,
27
+ child_story_id: unblocked_story_id,
28
+ parent_story_title: 'Blocked story'
29
+ }
30
+ ]
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+
3
+ module Tracker
4
+ module Application
5
+ describe LoadStory do
6
+ let(:story_id){CreateStory.perform(title: 'My Story').story_id}
7
+ subject(:result){LoadStory.perform(story_id: story_id)}
8
+
9
+ it 'creates a story' do
10
+ expect(result.story).to eq(id: story_id, title: 'My Story', started_at: nil, finished_at: nil, closed_at: nil)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+
3
+ module Tracker
4
+ module Application
5
+ describe LoadStoryStory do
6
+ let(:parent_story_id) { Tracker.pg[:stories].insert(title: 'Parent Story') }
7
+ let(:child_story_id) { Tracker.pg[:stories].insert(title: 'Child Story') }
8
+
9
+ subject(:result) do
10
+ LoadStoryStory.perform(
11
+ parent_story_id: parent_story_id,
12
+ child_story_id: child_story_id
13
+ )
14
+ end
15
+
16
+ context 'when the story story does not exist' do
17
+ it 'is empty and does not blow up' do
18
+ expect(result.story_story).should be_nil
19
+ end
20
+ end
21
+
22
+ context 'when the story story exists' do
23
+ let!(:story_story_id) do
24
+ Tracker.pg[:story_stories].insert(
25
+ parent_story_id: parent_story_id,
26
+ child_story_id: child_story_id
27
+ )
28
+ end
29
+
30
+ it 'loads the story story' do
31
+ expect(result.story_story).to eq(
32
+ id: story_story_id,
33
+ parent_story_id: parent_story_id,
34
+ child_story_id: child_story_id
35
+ )
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ module Tracker
4
+ module Application
5
+ describe LoadUnblockedStories do
6
+ let(:unblocked_story_id){Tracker.pg[:stories].insert(title: 'Unblocked story')}
7
+ let(:blocked_story_id){Tracker.pg[:stories].insert(title: 'Blocked story')}
8
+
9
+ before do
10
+ CreateStoryStory.perform(
11
+ parent_story_id: blocked_story_id,
12
+ child_story_id: unblocked_story_id
13
+ )
14
+ end
15
+
16
+ subject(:result) { LoadUnblockedStories.perform }
17
+
18
+ it 'is successful' do
19
+ expect(result).to be_success
20
+ end
21
+
22
+ it 'includes the unblocked story and not the blocked story' do
23
+ expect(result.unblocked_stories.all).to eq [
24
+ {
25
+ id: unblocked_story_id,
26
+ title: 'Unblocked story',
27
+ started_at: nil,
28
+ finished_at: nil,
29
+ closed_at: nil
30
+ }
31
+ ]
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,15 @@
1
+ require 'bundler'
2
+ Bundler.require
3
+ require 'tracker/application'
4
+
5
+ ENV['TEST_DATABASE_URL'] ||= 'postgres://postgres@localhost:5432/new_tracker_test'
6
+
7
+ Tracker::PG.database_url = ENV['TEST_DATABASE_URL']
8
+
9
+ RSpec.configure do |config|
10
+ config.around(:each) do |example|
11
+ Tracker.pg.transaction(rollback: :always) do
12
+ example.run
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'tracker/application/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "tracker-application"
8
+ spec.version = Tracker::Application::VERSION
9
+ spec.authors = ["Ben Bergstein"]
10
+ spec.email = ["bennyjbergstein@gmail.com"]
11
+ spec.description = "Application logic for a tracker app"
12
+ spec.summary = ""
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "interactor"
22
+ spec.add_dependency "tracker-p_g"
23
+
24
+ spec.add_development_dependency "bundler", "~> 1.3"
25
+ spec.add_development_dependency "foreman"
26
+ spec.add_development_dependency "rake"
27
+ spec.add_development_dependency "rspec"
28
+ spec.add_development_dependency "pry"
29
+ end
metadata ADDED
@@ -0,0 +1,188 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tracker-application
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Ben Bergstein
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-06-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: interactor
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: tracker-p_g
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '1.3'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '1.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: foreman
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: pry
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ description: Application logic for a tracker app
112
+ email:
113
+ - bennyjbergstein@gmail.com
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - .gitignore
119
+ - Gemfile
120
+ - LICENSE.txt
121
+ - README.md
122
+ - Rakefile
123
+ - lib/tracker/application.rb
124
+ - lib/tracker/application/create_story.rb
125
+ - lib/tracker/application/create_story_story.rb
126
+ - lib/tracker/application/load_blocked_stories.rb
127
+ - lib/tracker/application/load_closed_stories.rb
128
+ - lib/tracker/application/load_epic_stories.rb
129
+ - lib/tracker/application/load_finished_stories.rb
130
+ - lib/tracker/application/load_started_stories.rb
131
+ - lib/tracker/application/load_story.rb
132
+ - lib/tracker/application/load_story_child_story_stories.rb
133
+ - lib/tracker/application/load_story_parent_story_stories.rb
134
+ - lib/tracker/application/load_story_story.rb
135
+ - lib/tracker/application/load_unblocked_stories.rb
136
+ - lib/tracker/application/version.rb
137
+ - spec/create_story_spec.rb
138
+ - spec/create_story_story_spec.rb
139
+ - spec/load_blocked_stories_spec.rb
140
+ - spec/load_closed_stories_spec.rb
141
+ - spec/load_epic_stories_spec.rb
142
+ - spec/load_finished_stories_spec.rb
143
+ - spec/load_started_stories_spec.rb
144
+ - spec/load_story_child_story_stories_spec.rb
145
+ - spec/load_story_parent_story_stories_spec.rb
146
+ - spec/load_story_spec.rb
147
+ - spec/load_story_story_spec.rb
148
+ - spec/load_unblocked_stories_spec.rb
149
+ - spec/spec_helper.rb
150
+ - tracker-application.gemspec
151
+ homepage: ''
152
+ licenses:
153
+ - MIT
154
+ metadata: {}
155
+ post_install_message:
156
+ rdoc_options: []
157
+ require_paths:
158
+ - lib
159
+ required_ruby_version: !ruby/object:Gem::Requirement
160
+ requirements:
161
+ - - '>='
162
+ - !ruby/object:Gem::Version
163
+ version: '0'
164
+ required_rubygems_version: !ruby/object:Gem::Requirement
165
+ requirements:
166
+ - - '>='
167
+ - !ruby/object:Gem::Version
168
+ version: '0'
169
+ requirements: []
170
+ rubyforge_project:
171
+ rubygems_version: 2.0.3
172
+ signing_key:
173
+ specification_version: 4
174
+ summary: ''
175
+ test_files:
176
+ - spec/create_story_spec.rb
177
+ - spec/create_story_story_spec.rb
178
+ - spec/load_blocked_stories_spec.rb
179
+ - spec/load_closed_stories_spec.rb
180
+ - spec/load_epic_stories_spec.rb
181
+ - spec/load_finished_stories_spec.rb
182
+ - spec/load_started_stories_spec.rb
183
+ - spec/load_story_child_story_stories_spec.rb
184
+ - spec/load_story_parent_story_stories_spec.rb
185
+ - spec/load_story_spec.rb
186
+ - spec/load_story_story_spec.rb
187
+ - spec/load_unblocked_stories_spec.rb
188
+ - spec/spec_helper.rb