troo 0.0.1 → 0.0.2
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.
- checksums.yaml +4 -4
- data/.gitignore +7 -0
- data/.ruby-version +1 -0
- data/Gemfile +0 -1
- data/Guardfile +6 -0
- data/LICENSE.txt +1 -0
- data/README.md +46 -3
- data/Rakefile +11 -0
- data/bin/troo +12 -0
- data/configuration.yml.example +7 -0
- data/features/add_board.feature +1 -0
- data/features/add_card.feature +1 -0
- data/features/add_comment.feature +1 -0
- data/features/add_list.feature +1 -0
- data/features/cleanup.feature +0 -0
- data/features/move_card_to_list.feature +1 -0
- data/features/refresh.feature +1 -0
- data/features/set_default.feature +7 -0
- data/features/show_board.feature +1 -0
- data/features/show_boards.feature +1 -0
- data/features/show_card.feature +1 -0
- data/features/show_comments.feature +1 -0
- data/features/show_list.feature +1 -0
- data/features/status.feature +1 -0
- data/features/step_definitions/troo_steps.rb +0 -0
- data/features/support/env.rb +31 -0
- data/features/troo.feature +1 -0
- data/features/version.feature +8 -0
- data/lib/troo.rb +24 -2
- data/lib/troo/actions/create_board.rb +43 -0
- data/lib/troo/actions/create_card.rb +43 -0
- data/lib/troo/actions/create_comment.rb +44 -0
- data/lib/troo/actions/create_list.rb +41 -0
- data/lib/troo/actions/move_card.rb +36 -0
- data/lib/troo/actions/refresh_all.rb +79 -0
- data/lib/troo/actions/set_default.rb +35 -0
- data/lib/troo/cli/add_cli.rb +83 -0
- data/lib/troo/cli/default_cli.rb +37 -0
- data/lib/troo/cli/main_cli.rb +130 -0
- data/lib/troo/cli/show_cli.rb +83 -0
- data/lib/troo/cli/thor_fixes.rb +9 -0
- data/lib/troo/display/board_decorator.rb +58 -0
- data/lib/troo/display/board_presenter.rb +65 -0
- data/lib/troo/display/card_decorator.rb +105 -0
- data/lib/troo/display/card_presenter.rb +27 -0
- data/lib/troo/display/comment_decorator.rb +32 -0
- data/lib/troo/display/comment_presenter.rb +35 -0
- data/lib/troo/display/decorator_helpers.rb +76 -0
- data/lib/troo/display/list_decorator.rb +53 -0
- data/lib/troo/display/list_presenter.rb +43 -0
- data/lib/troo/display/member_decorator.rb +24 -0
- data/lib/troo/display/member_presenter.rb +59 -0
- data/lib/troo/external/board.rb +49 -0
- data/lib/troo/external/board_adaptor.rb +43 -0
- data/lib/troo/external/card.rb +70 -0
- data/lib/troo/external/card_adaptor.rb +78 -0
- data/lib/troo/external/comment.rb +64 -0
- data/lib/troo/external/comment_adaptor.rb +53 -0
- data/lib/troo/external/list.rb +58 -0
- data/lib/troo/external/list_adaptor.rb +48 -0
- data/lib/troo/external/member.rb +52 -0
- data/lib/troo/external/member_adaptor.rb +63 -0
- data/lib/troo/models/board.rb +26 -0
- data/lib/troo/models/board_persistence.rb +53 -0
- data/lib/troo/models/board_retrieval.rb +45 -0
- data/lib/troo/models/card.rb +54 -0
- data/lib/troo/models/card_persistence.rb +53 -0
- data/lib/troo/models/card_retrieval.rb +49 -0
- data/lib/troo/models/comment.rb +32 -0
- data/lib/troo/models/comment_persistence.rb +53 -0
- data/lib/troo/models/comment_retrieval.rb +32 -0
- data/lib/troo/models/list.rb +27 -0
- data/lib/troo/models/list_persistence.rb +53 -0
- data/lib/troo/models/list_retrieval.rb +45 -0
- data/lib/troo/models/member.rb +18 -0
- data/lib/troo/models/member_persistence.rb +53 -0
- data/lib/troo/models/member_retrieval.rb +36 -0
- data/lib/troo/models/model_helpers.rb +32 -0
- data/lib/troo/models/refresh.rb +23 -0
- data/lib/troo/presentation/template.rb +31 -0
- data/lib/troo/troo.rb +69 -0
- data/lib/troo/version.rb +2 -1
- data/lib/troo/views/card.erb +17 -0
- data/lib/troo/views/comment.erb +3 -0
- data/logs/.gitkeep +0 -0
- data/test/cassettes/board_by_id.yml +59 -0
- data/test/cassettes/boards_all.yml +118 -0
- data/test/cassettes/card_by_card_id.yml +58 -0
- data/test/cassettes/cards_by_board_id.yml +117 -0
- data/test/cassettes/cards_by_list_id.yml +114 -0
- data/test/cassettes/comments_by_board_id.yml +122 -0
- data/test/cassettes/comments_by_card_id.yml +114 -0
- data/test/cassettes/comments_by_list_id.yml +109 -0
- data/test/cassettes/create_board.yml +62 -0
- data/test/cassettes/create_card.yml +63 -0
- data/test/cassettes/create_comment.yml +67 -0
- data/test/cassettes/create_list.yml +60 -0
- data/test/cassettes/list_by_list_id.yml +56 -0
- data/test/cassettes/lists_by_board_id.yml +118 -0
- data/test/cassettes/member_by_member_id.yml +60 -0
- data/test/cassettes/members_by_board_id.yml +109 -0
- data/test/cassettes/move_card.yml +61 -0
- data/test/lib/troo/actions/create_board_test.rb +47 -0
- data/test/lib/troo/actions/create_card_test.rb +54 -0
- data/test/lib/troo/actions/create_comment_test.rb +49 -0
- data/test/lib/troo/actions/create_list_test.rb +49 -0
- data/test/lib/troo/actions/move_card_test.rb +46 -0
- data/test/lib/troo/actions/refresh_all_test.rb +68 -0
- data/test/lib/troo/actions/set_default_test.rb +44 -0
- data/test/lib/troo/cli/add_cli_test.rb +216 -0
- data/test/lib/troo/cli/default_cli_test.rb +79 -0
- data/test/lib/troo/cli/main_cli_test.rb +232 -0
- data/test/lib/troo/cli/show_cli_test.rb +221 -0
- data/test/lib/troo/cli/thor_fixes_test.rb +21 -0
- data/test/lib/troo/display/board_decorator_test.rb +126 -0
- data/test/lib/troo/display/board_presenter_test.rb +77 -0
- data/test/lib/troo/display/card_decorator_test.rb +221 -0
- data/test/lib/troo/display/card_presenter_test.rb +38 -0
- data/test/lib/troo/display/comment_decorator_test.rb +65 -0
- data/test/lib/troo/display/comment_presenter_test.rb +47 -0
- data/test/lib/troo/display/decorator_helpers_test.rb +7 -0
- data/test/lib/troo/display/list_decorator_test.rb +98 -0
- data/test/lib/troo/display/list_presenter_test.rb +48 -0
- data/test/lib/troo/display/member_decorator_test.rb +42 -0
- data/test/lib/troo/display/member_presenter_test.rb +70 -0
- data/test/lib/troo/external/board_adaptor_test.rb +36 -0
- data/test/lib/troo/external/board_test.rb +69 -0
- data/test/lib/troo/external/card_adaptor_test.rb +50 -0
- data/test/lib/troo/external/card_test.rb +108 -0
- data/test/lib/troo/external/comment_adaptor_test.rb +41 -0
- data/test/lib/troo/external/comment_test.rb +88 -0
- data/test/lib/troo/external/list_adaptor_test.rb +38 -0
- data/test/lib/troo/external/list_test.rb +65 -0
- data/test/lib/troo/external/member_adaptor_test.rb +44 -0
- data/test/lib/troo/external/member_test.rb +65 -0
- data/test/lib/troo/models/board_persistence_test.rb +61 -0
- data/test/lib/troo/models/board_retrieval_test.rb +93 -0
- data/test/lib/troo/models/board_test.rb +50 -0
- data/test/lib/troo/models/card_persistence_test.rb +60 -0
- data/test/lib/troo/models/card_retrieval_test.rb +101 -0
- data/test/lib/troo/models/card_test.rb +102 -0
- data/test/lib/troo/models/comment_persistence_test.rb +65 -0
- data/test/lib/troo/models/comment_retrieval_test.rb +46 -0
- data/test/lib/troo/models/comment_test.rb +59 -0
- data/test/lib/troo/models/list_persistence_test.rb +60 -0
- data/test/lib/troo/models/list_retrieval_test.rb +93 -0
- data/test/lib/troo/models/list_test.rb +53 -0
- data/test/lib/troo/models/member_persistence_test.rb +59 -0
- data/test/lib/troo/models/member_retrieval_test.rb +58 -0
- data/test/lib/troo/models/member_test.rb +44 -0
- data/test/lib/troo/models/model_helpers_test.rb +103 -0
- data/test/lib/troo/models/refresh_test.rb +45 -0
- data/test/lib/troo/presentation/template_test.rb +40 -0
- data/test/support/fabrication.rb +56 -0
- data/test/support/template.erb +3 -0
- data/test/support/vcr_setup.rb +36 -0
- data/test/test_helper.rb +30 -0
- data/troo.gemspec +24 -5
- metadata +501 -23
@@ -0,0 +1,60 @@
|
|
1
|
+
require_relative "../../../test_helper"
|
2
|
+
|
3
|
+
module Troo
|
4
|
+
describe ListPersistence do
|
5
|
+
let(:described_class) { ListPersistence }
|
6
|
+
let(:resource) { OpenStruct.new({
|
7
|
+
id: "526d8e130a14a9d846001d97",
|
8
|
+
name: resource_name,
|
9
|
+
closed: false
|
10
|
+
}) }
|
11
|
+
let(:resource_name) { "My Test List" }
|
12
|
+
let(:options) { {} }
|
13
|
+
|
14
|
+
before { @list = Fabricate(:list) }
|
15
|
+
after { database_cleanup }
|
16
|
+
|
17
|
+
describe ".initialize" do
|
18
|
+
subject { described_class.new(resource, options) }
|
19
|
+
|
20
|
+
it "assigns the resource to an instance variable" do
|
21
|
+
subject.instance_variable_get("@resource").must_equal(resource)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "assigns the options to an instance variable" do
|
25
|
+
subject.instance_variable_get("@options").must_equal(options)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "#persist" do
|
30
|
+
subject { described_class.for(resource, options) }
|
31
|
+
|
32
|
+
context "when there is already a local copy" do
|
33
|
+
context "and the local copy is identical" do
|
34
|
+
it "returns the local copy" do
|
35
|
+
subject.must_equal(@list)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
context "and the local copy is out of date" do
|
40
|
+
let(:resource_name) { "My Renamed List" }
|
41
|
+
|
42
|
+
it "updates and returns the new local copy" do
|
43
|
+
subject.name.must_equal(resource_name)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
context "when there is not already a local copy" do
|
49
|
+
let(:resource_name) { "My New Test List" }
|
50
|
+
|
51
|
+
before { database_cleanup }
|
52
|
+
|
53
|
+
it "creates and returns the new local copy" do
|
54
|
+
subject.name.must_equal(resource_name)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
@@ -0,0 +1,93 @@
|
|
1
|
+
require_relative "../../../test_helper"
|
2
|
+
|
3
|
+
module Troo
|
4
|
+
describe ListRetrieval do
|
5
|
+
let(:described_class) { ListRetrieval }
|
6
|
+
let(:default) { true }
|
7
|
+
let(:list_name) { "My Test List" }
|
8
|
+
|
9
|
+
before { @list = Fabricate(:list, default: default, name: list_name) }
|
10
|
+
after { database_cleanup }
|
11
|
+
|
12
|
+
describe ".all" do
|
13
|
+
subject { described_class.all }
|
14
|
+
|
15
|
+
it "retrieves all locally stored lists" do
|
16
|
+
subject.size.must_equal 1
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe ".default" do
|
21
|
+
subject { described_class.default }
|
22
|
+
|
23
|
+
context "when default is set" do
|
24
|
+
it "returns the default" do
|
25
|
+
subject.must_equal @list
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context "when default is not set" do
|
30
|
+
let(:default) { false }
|
31
|
+
|
32
|
+
it { subject.must_equal(nil) }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe ".retrieve" do
|
37
|
+
context "without an ID" do
|
38
|
+
subject { described_class.retrieve }
|
39
|
+
|
40
|
+
context "when default is set" do
|
41
|
+
it "returns the default" do
|
42
|
+
subject.must_equal @list
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context "when default is not set" do
|
47
|
+
let(:default) { false }
|
48
|
+
|
49
|
+
it { subject.must_equal(nil) }
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
context "with an ID" do
|
54
|
+
subject { described_class.retrieve(id) }
|
55
|
+
|
56
|
+
context "local retrieval by database ID" do
|
57
|
+
let(:id) { @list.id }
|
58
|
+
|
59
|
+
it "returns the correct list" do
|
60
|
+
subject.name.must_equal("My Test List")
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
context "local retrieval by external ID" do
|
65
|
+
let(:id) { "526d8e130a14a9d846001d97" }
|
66
|
+
|
67
|
+
it "returns the correct list" do
|
68
|
+
subject.name.must_equal("My Test List")
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
context "remote retrieval by either ID" do
|
73
|
+
let(:id) { "526d_remote_list_005259" }
|
74
|
+
let(:list_name) { "My Remote Test List" }
|
75
|
+
|
76
|
+
before { External::List.stubs(:fetch).returns([@list]) }
|
77
|
+
|
78
|
+
it "returns the correct list" do
|
79
|
+
subject.name.must_equal("My Remote Test List")
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
context "when the ID cannot be found" do
|
84
|
+
let(:id) { "not_found_id" }
|
85
|
+
|
86
|
+
before { External::List.stubs(:fetch).returns([]) }
|
87
|
+
|
88
|
+
it { subject.must_equal(nil) }
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require_relative "../../../test_helper"
|
2
|
+
|
3
|
+
module Troo
|
4
|
+
describe List do
|
5
|
+
let(:described_class) { List }
|
6
|
+
let(:described_instance) { Fabricate.build(:list) }
|
7
|
+
|
8
|
+
subject { described_instance }
|
9
|
+
|
10
|
+
context "attributes" do
|
11
|
+
it "should have a name attribute" do
|
12
|
+
subject.name.must_equal "My Test List"
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should have a position attribute" do
|
16
|
+
subject.position.must_equal 32768
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should have a default attribute" do
|
20
|
+
subject.default.must_equal false
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should have a closed attribute" do
|
24
|
+
subject.closed.must_equal false
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should have a external_board_id attribute" do
|
28
|
+
subject.external_board_id.must_equal "526d8e130a14a9d846001d96"
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should have an external_list_id attribute" do
|
32
|
+
subject.external_list_id.must_equal "526d8e130a14a9d846001d97"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
context "associations" do
|
37
|
+
before do
|
38
|
+
@board = Fabricate(:board)
|
39
|
+
@card = Fabricate(:card)
|
40
|
+
end
|
41
|
+
|
42
|
+
after { database_cleanup }
|
43
|
+
|
44
|
+
it "belongs to a board" do
|
45
|
+
subject.board.must_equal @board
|
46
|
+
end
|
47
|
+
|
48
|
+
it "can have many cards" do
|
49
|
+
subject.cards.size.must_equal 1
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require_relative "../../../test_helper"
|
2
|
+
|
3
|
+
module Troo
|
4
|
+
describe MemberPersistence do
|
5
|
+
let(:described_class) { MemberPersistence }
|
6
|
+
let(:resource) { OpenStruct.new({
|
7
|
+
id: "5195fdb5a8c01a2318004f5d",
|
8
|
+
full_name: resource_full_name
|
9
|
+
}) }
|
10
|
+
let(:resource_full_name) { "My Test Member" }
|
11
|
+
let(:options) { { } }
|
12
|
+
|
13
|
+
before { @member = Fabricate(:member) }
|
14
|
+
after { database_cleanup }
|
15
|
+
|
16
|
+
describe ".initialize" do
|
17
|
+
subject { described_class.new(resource, options) }
|
18
|
+
|
19
|
+
it "assigns the resource to an instance variable" do
|
20
|
+
subject.instance_variable_get("@resource").must_equal(resource)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "assigns the options to an instance variable" do
|
24
|
+
subject.instance_variable_get("@options").must_equal(options)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe "#persist" do
|
29
|
+
subject { described_class.for(resource, options) }
|
30
|
+
|
31
|
+
context "when there is already a local copy" do
|
32
|
+
context "and the local copy is identical" do
|
33
|
+
it "returns the local copy" do
|
34
|
+
subject.must_equal(@member)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context "and the local copy is out of date" do
|
39
|
+
let(:resource_full_name) { "My Renamed Member" }
|
40
|
+
|
41
|
+
it "updates and returns the new local copy" do
|
42
|
+
subject.full_name.must_equal(resource_full_name)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context "when there is not already a local copy" do
|
48
|
+
let(:resource_full_name) { "My New Test Member" }
|
49
|
+
|
50
|
+
before { database_cleanup }
|
51
|
+
|
52
|
+
it "creates and returns the new local copy" do
|
53
|
+
subject.full_name.must_equal(resource_full_name)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require_relative "../../../test_helper"
|
2
|
+
|
3
|
+
module Troo
|
4
|
+
describe MemberRetrieval do
|
5
|
+
let(:described_class) { MemberRetrieval }
|
6
|
+
let(:full_name) { "My Test Member" }
|
7
|
+
|
8
|
+
before { @member = Fabricate(:member, full_name: full_name) }
|
9
|
+
after { database_cleanup }
|
10
|
+
|
11
|
+
describe ".all" do
|
12
|
+
subject { described_class.all }
|
13
|
+
|
14
|
+
it "retrieves all locally stored members" do
|
15
|
+
subject.size.must_equal 1
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe ".retrieve" do
|
20
|
+
subject { described_class.retrieve(id) }
|
21
|
+
|
22
|
+
context "local retrieval by database ID" do
|
23
|
+
let(:id) { @member.id }
|
24
|
+
|
25
|
+
it "returns the correct member" do
|
26
|
+
subject.full_name.must_equal("My Test Member")
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
context "local retrieval by external ID" do
|
31
|
+
let(:id) { "5195fdb5a8c01a2318004f5d" }
|
32
|
+
|
33
|
+
it "returns the correct member" do
|
34
|
+
subject.full_name.must_equal("My Test Member")
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context "remote retrieval by either ID" do
|
39
|
+
let(:id) { "526d_remote_member_005259" }
|
40
|
+
let(:full_name) { "My Remote Test Member" }
|
41
|
+
|
42
|
+
before { External::Member.stubs(:fetch).returns([@member]) }
|
43
|
+
|
44
|
+
it "returns the correct member" do
|
45
|
+
subject.full_name.must_equal("My Remote Test Member")
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
context "when the ID cannot be found" do
|
50
|
+
let(:id) { "not_found_id" }
|
51
|
+
|
52
|
+
before { External::Member.stubs(:fetch).returns([]) }
|
53
|
+
|
54
|
+
it { subject.must_equal(nil) }
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require_relative "../../../test_helper"
|
2
|
+
|
3
|
+
module Troo
|
4
|
+
describe Member do
|
5
|
+
let(:described_class) { Member }
|
6
|
+
let(:described_instance) { Fabricate.build(:member) }
|
7
|
+
|
8
|
+
subject { described_instance }
|
9
|
+
|
10
|
+
context "attributes" do
|
11
|
+
it "should have a username attribute" do
|
12
|
+
subject.username.must_equal "gavinlaking1"
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should have an email attribute" do
|
16
|
+
subject.email.must_equal "gavinlaking@gmail.com"
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should have a full_name attribute" do
|
20
|
+
subject.full_name.must_equal "Gavin Laking"
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should have an initials attribute" do
|
24
|
+
subject.initials.must_equal "GL"
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should have an avatar_id attribute" do
|
28
|
+
subject.avatar_id.must_equal "some_avatar_id"
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should have a bio attribute" do
|
32
|
+
subject.bio.must_equal "some bio"
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should have a url attribute" do
|
36
|
+
subject.url.must_equal "http://www.gavinlaking.name/"
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should have an external_member_id attribute" do
|
40
|
+
subject.external_member_id.must_equal "5195fdb5a8c01a2318004f5d"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
require_relative "../../../test_helper"
|
2
|
+
|
3
|
+
class ModelHelpersDummy < Ohm::Model
|
4
|
+
include Troo::ModelHelpers
|
5
|
+
|
6
|
+
attribute :name
|
7
|
+
attribute :default
|
8
|
+
|
9
|
+
index :name
|
10
|
+
index :default
|
11
|
+
end
|
12
|
+
|
13
|
+
module Troo
|
14
|
+
describe ModelHelpersDummy do
|
15
|
+
let(:described_class) { ModelHelpersDummy }
|
16
|
+
|
17
|
+
before do
|
18
|
+
@dumb = ModelHelpersDummy.create({
|
19
|
+
name: "My Dumb Model",
|
20
|
+
default: false })
|
21
|
+
@dumber = ModelHelpersDummy.create({
|
22
|
+
name: "My Dumber Model",
|
23
|
+
default: true })
|
24
|
+
end
|
25
|
+
|
26
|
+
after { database_cleanup }
|
27
|
+
|
28
|
+
describe ".first" do
|
29
|
+
subject { described_class.first(criteria) }
|
30
|
+
|
31
|
+
context "when no criteria are provided" do
|
32
|
+
let(:criteria) { }
|
33
|
+
|
34
|
+
it "returns the first model stored of that type" do
|
35
|
+
subject.name.must_equal("My Dumb Model")
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
context "when criteria are provided" do
|
40
|
+
let(:criteria) { { name: "My Dumber Model" } }
|
41
|
+
|
42
|
+
it "returns the first model matching the criteria" do
|
43
|
+
subject.name.must_equal("My Dumber Model")
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe ".update" do
|
49
|
+
subject { described_class.update(criteria) }
|
50
|
+
|
51
|
+
context "when no criteria are provided" do
|
52
|
+
let(:criteria) { }
|
53
|
+
|
54
|
+
it "returns false; no update was performed" do
|
55
|
+
subject.must_equal(false)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
context "when criteria are provided" do
|
60
|
+
let(:criteria) { { name: "My Updated Model" } }
|
61
|
+
|
62
|
+
it "updates all records with the criteria" do
|
63
|
+
subject.must_equal(true)
|
64
|
+
ModelHelpersDummy.all.each do |dummy|
|
65
|
+
dummy.name.must_equal("My Updated Model")
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
describe ".default" do
|
72
|
+
subject { described_class.default }
|
73
|
+
|
74
|
+
context "when there is no default model" do
|
75
|
+
it "returns the model" do
|
76
|
+
subject.must_equal(@dumber)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
context "when there is a default model" do
|
81
|
+
before { @dumber.delete }
|
82
|
+
|
83
|
+
it { subject.must_equal(nil) }
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
describe ".count" do
|
88
|
+
subject { described_class.count }
|
89
|
+
|
90
|
+
it "returns the number of this model persisted" do
|
91
|
+
subject.must_equal(2)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
describe "#external_attributes" do
|
96
|
+
subject { @dumb.external_attributes }
|
97
|
+
|
98
|
+
it "returns the attributes of the model which Trello affects" do
|
99
|
+
subject.must_equal({ name: "My Dumb Model" })
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|