ketchup 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.
- data/LICENCE +20 -0
- data/README.textile +123 -0
- data/lib/ketchup.rb +36 -0
- data/lib/ketchup/api.rb +80 -0
- data/lib/ketchup/item.rb +75 -0
- data/lib/ketchup/item_array.rb +85 -0
- data/lib/ketchup/meeting.rb +96 -0
- data/lib/ketchup/meeting_array.rb +92 -0
- data/lib/ketchup/note.rb +73 -0
- data/lib/ketchup/note_array.rb +85 -0
- data/lib/ketchup/profile.rb +125 -0
- data/lib/ketchup/project.rb +51 -0
- data/spec/ketchup/api_spec.rb +120 -0
- data/spec/ketchup/item_array_spec.rb +125 -0
- data/spec/ketchup/item_spec.rb +127 -0
- data/spec/ketchup/meeting_array_spec.rb +141 -0
- data/spec/ketchup/meeting_spec.rb +142 -0
- data/spec/ketchup/note_array_spec.rb +125 -0
- data/spec/ketchup/note_spec.rb +126 -0
- data/spec/ketchup/profile_spec.rb +148 -0
- data/spec/ketchup/project_spec.rb +75 -0
- data/spec/ketchup_spec.rb +20 -0
- data/spec/spec_helper.rb +30 -0
- metadata +116 -0
@@ -0,0 +1,125 @@
|
|
1
|
+
require 'spec/spec_helper'
|
2
|
+
|
3
|
+
describe Ketchup::ItemArray do
|
4
|
+
before :each do
|
5
|
+
@api = stub('api', :get => [])
|
6
|
+
@meeting = Ketchup::Meeting.new @api, 'shortcode_url' => 'bar'
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should be a subclass of Array" do
|
10
|
+
Ketchup::ItemArray.superclass.should == Array
|
11
|
+
end
|
12
|
+
|
13
|
+
describe '#initialize' do
|
14
|
+
it "should instantiate items from the provided array" do
|
15
|
+
time = Time.now
|
16
|
+
items = Ketchup::ItemArray.new @api, @meeting, [{
|
17
|
+
'updated_at' => time,
|
18
|
+
'shortcode_url' => 'ZCTYXAeDb_rQ3IkRq9nutcwfxUpNPLBOsHM28Ela',
|
19
|
+
'notes' => [],
|
20
|
+
'content' => 'Foo',
|
21
|
+
'position' => 1,
|
22
|
+
'meeting_id' => 4321,
|
23
|
+
'created_at' => time
|
24
|
+
}]
|
25
|
+
items.first.should be_a(Ketchup::Item)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe '#build' do
|
30
|
+
before :each do
|
31
|
+
@items = Ketchup::ItemArray.new @api, @meeting
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should set the item's API object" do
|
35
|
+
item = @items.build 'content' => 'foo'
|
36
|
+
item.api.should == @api
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should pass on the options to the new item" do
|
40
|
+
item = @items.build 'content' => 'foo'
|
41
|
+
item.content.should == 'foo'
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should add the item to the array" do
|
45
|
+
item = @items.build 'content' => 'foo'
|
46
|
+
@items.should include(item)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe '#create' do
|
51
|
+
before :each do
|
52
|
+
@api.stub!(:post => {'content' => 'foo'})
|
53
|
+
@items = Ketchup::ItemArray.new @api, @meeting
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should set the item's API object" do
|
57
|
+
item = @items.create 'content' => 'foo'
|
58
|
+
item.api.should == @api
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should pass on the options to the new item" do
|
62
|
+
item = @items.create 'content' => 'foo'
|
63
|
+
item.content.should == 'foo'
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should add the item to the array" do
|
67
|
+
item = @items.create 'content' => 'foo'
|
68
|
+
@items.should include(item)
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should have already saved the item" do
|
72
|
+
@api.should_receive(:post)
|
73
|
+
|
74
|
+
item = @items.create 'content' => 'foo'
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
describe '#reorder' do
|
79
|
+
before :each do
|
80
|
+
@api.stub!(:put => [])
|
81
|
+
@items = Ketchup::ItemArray.new @api, @meeting, [
|
82
|
+
{'shortcode_url' => 'alpha', 'content' => 'Alpha'},
|
83
|
+
{'shortcode_url' => 'beta', 'content' => 'Beta' },
|
84
|
+
{'shortcode_url' => 'gamma', 'content' => 'Gamma'}
|
85
|
+
]
|
86
|
+
@alpha, @beta, @gamma = @items
|
87
|
+
end
|
88
|
+
|
89
|
+
it "should send a put request to the correct url" do
|
90
|
+
@api.should_receive(:put) do |query, options|
|
91
|
+
query.should == '/meetings/bar/sort_items.json'
|
92
|
+
end
|
93
|
+
|
94
|
+
@items.reorder @beta, @gamma, @alpha
|
95
|
+
end
|
96
|
+
|
97
|
+
it "should send the shortcode urls in the given order" do
|
98
|
+
@api.should_receive(:put) do |query, options|
|
99
|
+
options['items'].should == ['beta', 'gamma', 'alpha']
|
100
|
+
end
|
101
|
+
|
102
|
+
@items.reorder @beta, @gamma, @alpha
|
103
|
+
end
|
104
|
+
|
105
|
+
it "should change the order of the array" do
|
106
|
+
@items.reorder @beta, @gamma, @alpha
|
107
|
+
@items[0].should == @beta
|
108
|
+
@items[1].should == @gamma
|
109
|
+
@items[2].should == @alpha
|
110
|
+
end
|
111
|
+
|
112
|
+
it "should raise an error if not the same items" do
|
113
|
+
item = Ketchup::Item.new @api, @meeting, 'shortcode_url' => 'delta'
|
114
|
+
lambda {
|
115
|
+
@items.reorder item, @beta, @alpha
|
116
|
+
}.should raise_error(ArgumentError)
|
117
|
+
end
|
118
|
+
|
119
|
+
it "should raise an error if not all the items" do
|
120
|
+
lambda {
|
121
|
+
@items.reorder @alpha, @gamma
|
122
|
+
}.should raise_error(ArgumentError)
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
@@ -0,0 +1,127 @@
|
|
1
|
+
require 'spec/spec_helper'
|
2
|
+
|
3
|
+
describe Ketchup::Item do
|
4
|
+
before :each do
|
5
|
+
@api = stub('api')
|
6
|
+
@meeting = Ketchup::Meeting.new @api
|
7
|
+
end
|
8
|
+
|
9
|
+
describe '#initialize' do
|
10
|
+
it "should initialize all the attributes" do
|
11
|
+
time = Time.now
|
12
|
+
item = Ketchup::Item.new(@api, @meeting,
|
13
|
+
'updated_at' => time,
|
14
|
+
'shortcode_url' => 'ZCTYXAeDb_rQ3IkRq9nutcwfxUpNPLBOsHM28Ela',
|
15
|
+
'notes' => [],
|
16
|
+
'content' => 'Foo',
|
17
|
+
'position' => 1,
|
18
|
+
'meeting_id' => 4321,
|
19
|
+
'created_at' => time
|
20
|
+
)
|
21
|
+
|
22
|
+
item.updated_at.should == time
|
23
|
+
item.shortcode_url.should == 'ZCTYXAeDb_rQ3IkRq9nutcwfxUpNPLBOsHM28Ela'
|
24
|
+
item.notes.should == []
|
25
|
+
item.content.should == 'Foo'
|
26
|
+
item.position.should == 1
|
27
|
+
item.meeting_id.should == 4321
|
28
|
+
item.created_at.should == time
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe '#new_record?' do
|
33
|
+
it "should return true if item has no shortcode_url" do
|
34
|
+
item = Ketchup::Item.new @api, @meeting
|
35
|
+
item.should be_new_record
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should return false if item has a shortcode_url" do
|
39
|
+
item = Ketchup::Item.new @api, @meeting, 'shortcode_url' => 'foo'
|
40
|
+
item.should_not be_new_record
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe '#save' do
|
45
|
+
it "should send a post if creating" do
|
46
|
+
@api.should_receive(:post).and_return({})
|
47
|
+
|
48
|
+
item = Ketchup::Item.new @api, @meeting, 'content' => 'foo'
|
49
|
+
item.save
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should include writeable attributes in the post" do
|
53
|
+
@api.should_receive(:post) do |query, options|
|
54
|
+
options['content'].should == 'foo'
|
55
|
+
{}
|
56
|
+
end
|
57
|
+
|
58
|
+
item = Ketchup::Item.new @api, @meeting, 'content' => 'foo'
|
59
|
+
item.save
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should not include read-only attributes in the post" do
|
63
|
+
@api.should_receive(:post) do |query, options|
|
64
|
+
options.keys.should_not include('created_at')
|
65
|
+
{}
|
66
|
+
end
|
67
|
+
|
68
|
+
item = Ketchup::Item.new @api, @meeting, 'created_at' => Time.now
|
69
|
+
item.save
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should update the object with the response" do
|
73
|
+
@api.stub!(:post => {'shortcode_url' => 'foo'})
|
74
|
+
|
75
|
+
item = Ketchup::Item.new @api, @meeting, 'content' => 'Foo'
|
76
|
+
item.save
|
77
|
+
item.shortcode_url.should == 'foo'
|
78
|
+
end
|
79
|
+
|
80
|
+
it "should send a put if updating" do
|
81
|
+
@api.should_receive(:put).and_return({})
|
82
|
+
|
83
|
+
item = Ketchup::Item.new @api, @meeting, 'shortcode_url' => 'foo'
|
84
|
+
item.save
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should include writeable attributes in the put" do
|
88
|
+
@api.should_receive(:put) do |query, options|
|
89
|
+
options['content'].should == 'foo'
|
90
|
+
{}
|
91
|
+
end
|
92
|
+
|
93
|
+
item = Ketchup::Item.new @api, @meeting,
|
94
|
+
'shortcode_url' => 'foo', 'content' => 'foo'
|
95
|
+
item.save
|
96
|
+
end
|
97
|
+
|
98
|
+
it "should not include read-only attributes in the put" do
|
99
|
+
@api.should_receive(:put) do |query, options|
|
100
|
+
options.keys.should_not include('created_at')
|
101
|
+
{}
|
102
|
+
end
|
103
|
+
|
104
|
+
item = Ketchup::Item.new @api, @meeting,
|
105
|
+
'shortcode_url' => 'foo', 'created_at' => Time.now
|
106
|
+
item.save
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
describe '#destroy' do
|
111
|
+
it "should delete the item" do
|
112
|
+
@api.should_receive(:delete) do |query, options|
|
113
|
+
query.should == '/items/foo.json'
|
114
|
+
end
|
115
|
+
|
116
|
+
item = Ketchup::Item.new @api, @meeting, 'shortcode_url' => 'foo'
|
117
|
+
item.destroy
|
118
|
+
end
|
119
|
+
|
120
|
+
it "should do nothing if the record isn't already saved" do
|
121
|
+
@api.should_not_receive(:delete)
|
122
|
+
|
123
|
+
item = Ketchup::Item.new @api, @meeting
|
124
|
+
item.destroy
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
@@ -0,0 +1,141 @@
|
|
1
|
+
require 'spec/spec_helper'
|
2
|
+
|
3
|
+
describe Ketchup::MeetingArray do
|
4
|
+
before :each do
|
5
|
+
@api = stub('api', :get => [])
|
6
|
+
end
|
7
|
+
|
8
|
+
it "should be a subclass of Array" do
|
9
|
+
Ketchup::MeetingArray.superclass.should == Array
|
10
|
+
end
|
11
|
+
|
12
|
+
describe '#initialize' do
|
13
|
+
it "should load meetings from the api" do
|
14
|
+
@api.stub!(:get => [{
|
15
|
+
"updated_at" => Time.now,
|
16
|
+
"project_id" => nil,
|
17
|
+
"title" => "Another Meeting",
|
18
|
+
"quick" => nil,
|
19
|
+
"public" => false,
|
20
|
+
"items" => [],
|
21
|
+
"shortcode_url" => "Bmq58b",
|
22
|
+
"date" => Time.now,
|
23
|
+
"attendees" => "",
|
24
|
+
"description" => nil,
|
25
|
+
"public_url" => "bm5aTN",
|
26
|
+
"project_name" => nil,
|
27
|
+
"user_id" => 6542,
|
28
|
+
"location" => nil,
|
29
|
+
"created_at" => Time.now
|
30
|
+
}])
|
31
|
+
meetings = Ketchup::MeetingArray.new @api
|
32
|
+
meetings.first.should be_a(Ketchup::Meeting)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe '#build' do
|
37
|
+
before :each do
|
38
|
+
@meetings = Ketchup::MeetingArray.new @api
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should set the meeting's API object" do
|
42
|
+
meeting = @meetings.build 'title' => 'foo'
|
43
|
+
meeting.api.should == @api
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should pass on the options to the new meeting" do
|
47
|
+
meeting = @meetings.build 'title' => 'foo'
|
48
|
+
meeting.title.should == 'foo'
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should add the meeting to the array" do
|
52
|
+
meeting = @meetings.build 'title' => 'foo'
|
53
|
+
@meetings.should include(meeting)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe '#create' do
|
58
|
+
before :each do
|
59
|
+
@api.stub!(:post => {'title' => 'foo'})
|
60
|
+
@meetings = Ketchup::MeetingArray.new @api
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should set the meeting's API object" do
|
64
|
+
meeting = @meetings.create 'title' => 'foo'
|
65
|
+
meeting.api.should == @api
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should pass on the options to the new meeting" do
|
69
|
+
meeting = @meetings.create 'title' => 'foo'
|
70
|
+
meeting.title.should == 'foo'
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should add the meeting to the array" do
|
74
|
+
meeting = @meetings.create 'title' => 'foo'
|
75
|
+
@meetings.should include(meeting)
|
76
|
+
end
|
77
|
+
|
78
|
+
it "should have already saved the meeting" do
|
79
|
+
@api.should_receive(:post)
|
80
|
+
|
81
|
+
meeting = @meetings.create 'title' => 'foo'
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
describe '#upcoming' do
|
86
|
+
before :each do
|
87
|
+
@meetings = Ketchup::MeetingArray.new @api
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should load the upcoming meetings from the API" do
|
91
|
+
@api.should_receive(:get) do |query, options|
|
92
|
+
query.should == '/meetings/upcoming.json'
|
93
|
+
[]
|
94
|
+
end
|
95
|
+
|
96
|
+
@meetings.upcoming
|
97
|
+
end
|
98
|
+
|
99
|
+
it "should return an array of meetings" do
|
100
|
+
@meetings.upcoming.should be_an(Array)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
describe '#previous' do
|
105
|
+
before :each do
|
106
|
+
@meetings = Ketchup::MeetingArray.new @api
|
107
|
+
end
|
108
|
+
|
109
|
+
it "should load the previous meetings from the API" do
|
110
|
+
@api.should_receive(:get) do |query, options|
|
111
|
+
query.should == '/meetings/previous.json'
|
112
|
+
[]
|
113
|
+
end
|
114
|
+
|
115
|
+
@meetings.previous
|
116
|
+
end
|
117
|
+
|
118
|
+
it "should return an array of meetings" do
|
119
|
+
@meetings.previous.should be_an(Array)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
describe '#today' do
|
124
|
+
before :each do
|
125
|
+
@meetings = Ketchup::MeetingArray.new @api
|
126
|
+
end
|
127
|
+
|
128
|
+
it "should load today's meetings from the API" do
|
129
|
+
@api.should_receive(:get) do |query, options|
|
130
|
+
query.should == '/meetings/todays.json'
|
131
|
+
[]
|
132
|
+
end
|
133
|
+
|
134
|
+
@meetings.today
|
135
|
+
end
|
136
|
+
|
137
|
+
it "should return an array of meetings" do
|
138
|
+
@meetings.today.should be_an(Array)
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
@@ -0,0 +1,142 @@
|
|
1
|
+
require 'spec/spec_helper'
|
2
|
+
|
3
|
+
describe Ketchup::Meeting do
|
4
|
+
before :each do
|
5
|
+
@api = stub('api')
|
6
|
+
end
|
7
|
+
|
8
|
+
describe '#initialize' do
|
9
|
+
it "should initialize all the attributes" do
|
10
|
+
time = Time.now
|
11
|
+
meeting = Ketchup::Meeting.new(@api,
|
12
|
+
"updated_at" => time,
|
13
|
+
"project_id" => nil,
|
14
|
+
"title" => "Another Meeting",
|
15
|
+
"quick" => nil,
|
16
|
+
"public" => false,
|
17
|
+
"items" => [],
|
18
|
+
"shortcode_url" => "Bmq58b",
|
19
|
+
"date" => time,
|
20
|
+
"attendees" => "Me, You, Them",
|
21
|
+
"description" => "Just a meeting",
|
22
|
+
"public_url" => "bm5aTN",
|
23
|
+
"project_name" => "Top Secret",
|
24
|
+
"user_id" => 6542,
|
25
|
+
"location" => "Somewhere",
|
26
|
+
"created_at" => time
|
27
|
+
)
|
28
|
+
|
29
|
+
meeting.updated_at.should == time
|
30
|
+
meeting.project_id.should be_nil
|
31
|
+
meeting.title.should == 'Another Meeting'
|
32
|
+
meeting.quick.should be_nil
|
33
|
+
meeting.public.should be_false
|
34
|
+
meeting.items.should be_an(Ketchup::ItemArray)
|
35
|
+
meeting.shortcode_url.should == 'Bmq58b'
|
36
|
+
meeting.date.should == time
|
37
|
+
meeting.attendees.should == 'Me, You, Them'
|
38
|
+
meeting.description.should == 'Just a meeting'
|
39
|
+
meeting.public_url.should == 'bm5aTN'
|
40
|
+
meeting.project_name.should == 'Top Secret'
|
41
|
+
meeting.user_id.should == 6542
|
42
|
+
meeting.location.should == 'Somewhere'
|
43
|
+
meeting.created_at.should == time
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe '#new_record?' do
|
48
|
+
it "should return true if meeting has no shortcode_url" do
|
49
|
+
meeting = Ketchup::Meeting.new @api
|
50
|
+
meeting.should be_new_record
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should return false if meeting has a shortcode_url" do
|
54
|
+
meeting = Ketchup::Meeting.new @api, 'shortcode_url' => 'foo'
|
55
|
+
meeting.should_not be_new_record
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe '#save' do
|
60
|
+
it "should send a post if creating" do
|
61
|
+
@api.should_receive(:post).and_return({})
|
62
|
+
|
63
|
+
meeting = Ketchup::Meeting.new @api, 'title' => 'foo'
|
64
|
+
meeting.save
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should include writeable attributes in the post" do
|
68
|
+
@api.should_receive(:post) do |query, options|
|
69
|
+
options['title'].should == 'foo'
|
70
|
+
{}
|
71
|
+
end
|
72
|
+
|
73
|
+
meeting = Ketchup::Meeting.new @api, 'title' => 'foo'
|
74
|
+
meeting.save
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should not include read-only attributes in the post" do
|
78
|
+
@api.should_receive(:post) do |query, options|
|
79
|
+
options.keys.should_not include('created_at')
|
80
|
+
{}
|
81
|
+
end
|
82
|
+
|
83
|
+
meeting = Ketchup::Meeting.new @api, 'created_at' => Time.now
|
84
|
+
meeting.save
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should update the object with the response" do
|
88
|
+
@api.stub!(:post => {'shortcode_url' => 'foo'})
|
89
|
+
|
90
|
+
meeting = Ketchup::Meeting.new @api, 'title' => 'Foo'
|
91
|
+
meeting.save
|
92
|
+
meeting.shortcode_url.should == 'foo'
|
93
|
+
end
|
94
|
+
|
95
|
+
it "should send a put if updating" do
|
96
|
+
@api.should_receive(:put).and_return({})
|
97
|
+
|
98
|
+
meeting = Ketchup::Meeting.new @api, 'shortcode_url' => 'foo'
|
99
|
+
meeting.save
|
100
|
+
end
|
101
|
+
|
102
|
+
it "should include writeable attributes in the put" do
|
103
|
+
@api.should_receive(:put) do |query, options|
|
104
|
+
options['title'].should == 'foo'
|
105
|
+
{}
|
106
|
+
end
|
107
|
+
|
108
|
+
meeting = Ketchup::Meeting.new @api,
|
109
|
+
'shortcode_url' => 'foo', 'title' => 'foo'
|
110
|
+
meeting.save
|
111
|
+
end
|
112
|
+
|
113
|
+
it "should not include read-only attributes in the put" do
|
114
|
+
@api.should_receive(:put) do |query, options|
|
115
|
+
options.keys.should_not include('created_at')
|
116
|
+
{}
|
117
|
+
end
|
118
|
+
|
119
|
+
meeting = Ketchup::Meeting.new @api,
|
120
|
+
'shortcode_url' => 'foo', 'created_at' => Time.now
|
121
|
+
meeting.save
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
describe '#destroy' do
|
126
|
+
it "should delete the meeting" do
|
127
|
+
@api.should_receive(:delete) do |query, options|
|
128
|
+
query.should == '/meetings/foo.json'
|
129
|
+
end
|
130
|
+
|
131
|
+
meeting = Ketchup::Meeting.new @api, 'shortcode_url' => 'foo'
|
132
|
+
meeting.destroy
|
133
|
+
end
|
134
|
+
|
135
|
+
it "should do nothing if the record isn't already saved" do
|
136
|
+
@api.should_not_receive(:delete)
|
137
|
+
|
138
|
+
meeting = Ketchup::Meeting.new @api
|
139
|
+
meeting.destroy
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|