amr_google_calendar 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/Gemfile +14 -0
- data/Gemfile.lock +27 -0
- data/LICENSE.txt +20 -0
- data/README.rdoc +54 -0
- data/Rakefile +49 -0
- data/VERSION +1 -0
- data/google_calendar.gemspec +84 -0
- data/lib/google/calendar.rb +223 -0
- data/lib/google/connection.rb +109 -0
- data/lib/google/errors.rb +7 -0
- data/lib/google/event.rb +182 -0
- data/lib/google/net/https.rb +19 -0
- data/lib/google_calendar.rb +6 -0
- data/test/helper.rb +21 -0
- data/test/mocks/create_event.xml +31 -0
- data/test/mocks/create_quickadd_event.xml +31 -0
- data/test/mocks/events.xml +119 -0
- data/test/mocks/find_event_by_id.xml +33 -0
- data/test/mocks/list_calendars.xml +89 -0
- data/test/mocks/query_events.xml +55 -0
- data/test/mocks/successful_login.txt +3 -0
- data/test/test_google_calendar.rb +268 -0
- metadata +194 -0
@@ -0,0 +1,33 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:gCal="http://schemas.google.com/gCal/2005" xmlns:gd="http://schemas.google.com/g/2005">
|
3
|
+
<id>http://www.google.com/calendar/feeds/default/private/full/oj6fmpaulbvk9ouoj0lj4v6hio</id>
|
4
|
+
<published>2010-04-22T16:05:29.000Z</published>
|
5
|
+
<updated>2010-05-01T05:14:18.000Z</updated>
|
6
|
+
<category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/g/2005#event"/>
|
7
|
+
<title type="text">Test</title>
|
8
|
+
<content type="text"/>
|
9
|
+
<link rel="alternate" type="text/html" href="https://www.google.com/calendar/event?eid=b2o2Zm1wYXVsYnZrOW91b2owbGo0djZoaW8gc3RldmUuemljaEBt" title="alternate"/>
|
10
|
+
<link rel="self" type="application/atom+xml" href="https://www.google.com/calendar/feeds/default/private/full/oj6fmpaulbvk9ouoj0lj4v6hio"/>
|
11
|
+
<link rel="edit" type="application/atom+xml" href="https://www.google.com/calendar/feeds/default/private/full/oj6fmpaulbvk9ouoj0lj4v6hio/63408374058"/>
|
12
|
+
<author>
|
13
|
+
<name>Some Guy</name>
|
14
|
+
<email>some.guy@gmail.com</email>
|
15
|
+
</author>
|
16
|
+
<gd:comments>
|
17
|
+
<gd:feedLink href="https://www.google.com/calendar/feeds/default/private/full/oj6fmpaulbvk9ouoj0lj4v6hio/comments"/>
|
18
|
+
</gd:comments>
|
19
|
+
<gd:eventStatus value="http://schemas.google.com/g/2005#event.confirmed"/>
|
20
|
+
<gd:where valueString=""/>
|
21
|
+
<gd:who email="some.guy@gmail.com" rel="http://schemas.google.com/g/2005#event.organizer" valueString="some.guy@gmail.com"/>
|
22
|
+
<gd:when endTime="2010-04-09" startTime="2010-04-08">
|
23
|
+
<gd:reminder method="alert" minutes="10"/>
|
24
|
+
</gd:when>
|
25
|
+
<gd:transparency value="http://schemas.google.com/g/2005#event.transparent"/>
|
26
|
+
<gd:visibility value="http://schemas.google.com/g/2005#event.default"/>
|
27
|
+
<gCal:anyoneCanAddSelf value="false"/>
|
28
|
+
<gCal:guestsCanInviteOthers value="true"/>
|
29
|
+
<gCal:guestsCanModify value="false"/>
|
30
|
+
<gCal:guestsCanSeeGuests value="true"/>
|
31
|
+
<gCal:sequence value="0"/>
|
32
|
+
<gCal:uid value="oj6fmpaulbvk9ouoj0lj4v6hio@google.com"/>
|
33
|
+
</entry>
|
@@ -0,0 +1,89 @@
|
|
1
|
+
<?xml version='1.0' encoding='utf-8'?>
|
2
|
+
<feed xmlns='http://www.w3.org/2005/Atom'
|
3
|
+
xmlns:openSearch='http://a9.com/-/spec/opensearch/1.1/'
|
4
|
+
xmlns:gCal='http://schemas.google.com/gCal/2005'
|
5
|
+
xmlns:gd='http://schemas.google.com/g/2005'
|
6
|
+
gd:etag='W/"CkYFSHg-fyp7ImA9WxRVGUo."'>
|
7
|
+
<id>http://www.google.com/calendar/feeds/default/allcalendars/full</id>
|
8
|
+
<updated>2008-11-18T01:01:59.657Z</updated>
|
9
|
+
<title>Coach's Calendar List</title>
|
10
|
+
<link rel='alternate' type='text/html'
|
11
|
+
href='https://www.google.com/calendar/render' />
|
12
|
+
<link rel='http://schemas.google.com/g/2005#feed'
|
13
|
+
type='application/atom+xml'
|
14
|
+
href='https://www.google.com/calendar/feeds/default/allcalendars/full' />
|
15
|
+
<link rel='http://schemas.google.com/g/2005#post'
|
16
|
+
type='application/atom+xml'
|
17
|
+
href='https://www.google.com/calendar/feeds/default/allcalendars/full' />
|
18
|
+
<link rel='self' type='application/atom+xml'
|
19
|
+
href='https://www.google.com/calendar/feeds/default/allcalendars/full' />
|
20
|
+
<author>
|
21
|
+
<name>Coach</name>
|
22
|
+
<email>user@gmail.com</email>
|
23
|
+
</author>
|
24
|
+
<generator version='1.0' uri='http://www.google.com/calendar'>Google Calendar</generator>
|
25
|
+
<openSearch:startIndex>1</openSearch:startIndex>
|
26
|
+
<entry gd:etag='W/"DU4ERH47eCp7ImA9WxRVEkQ."'>
|
27
|
+
<id>http://www.google.com/calendar/feeds/default/allcalendars/full/user%40gmail.com</id>
|
28
|
+
<published>2007-07-11T22:10:30.257Z</published>
|
29
|
+
<updated>2007-07-11T21:46:35.000Z</updated>
|
30
|
+
<title>My Primary Calendar</title>
|
31
|
+
<summary type='text'>A primary calendar is created by default for each Google Calendar user.</summary>
|
32
|
+
<link rel='alternate' type='application/atom+xml' href='https://www.google.com/calendar/feeds/user%40gmail.com/private/full' />
|
33
|
+
<link rel='http://schemas.google.com/gCal/2005#eventFeed' type='application/atom+xml' href='https://www.google.com/calendar/feeds/user%40gmail.com/private/full' />
|
34
|
+
<link rel='http://schemas.google.com/acl/2007#accessControlList' type='application/atom+xml' href='https://www.google.com/calendar/feeds/user%40gmail.com/acl/full' />
|
35
|
+
<link rel='self' type='application/atom+xml' href='https://www.google.com/calendar/feeds/default/allcalendars/full/user%40gmail.com' />
|
36
|
+
<link rel='edit' type='application/atom+xml' href='https://www.google.com/calendar/feeds/default/allcalendars/full/user%40gmail.com' />
|
37
|
+
<author>
|
38
|
+
<name>Coach</name>
|
39
|
+
<email>user@gmail.com</email>
|
40
|
+
</author>
|
41
|
+
<gCal:timezone value='America/Los_Angeles' />
|
42
|
+
<gCal:hidden value='false' />
|
43
|
+
<gCal:color value='#2952A3' />
|
44
|
+
<gCal:selected value='true' />
|
45
|
+
<gCal:accesslevel value='owner' />
|
46
|
+
<gd:where valueString='Mountain View' />
|
47
|
+
</entry>
|
48
|
+
<entry gd:etag='W/"Ck4GRH4-eSp7ImA9WxRVGUo."'>
|
49
|
+
<id>http://www.google.com/calendar/feeds/default/allcalendars/full/rf1c66uld6dgk2t5lh43svev6g%40group.calendar.google.com</id>
|
50
|
+
<published>2007-07-11T22:10:30.258Z</published>
|
51
|
+
<updated>2007-07-11T21:50:15.000Z</updated>
|
52
|
+
<title>Little Giants</title>
|
53
|
+
<summary type='text'>This calendar contains practice times and this season's Little League game schedule. Go Little Giants!</summary>
|
54
|
+
<link rel='alternate' type='application/atom+xml' href='https://www.google.com/calendar/feeds/rf1c66uld6dgk2t5lh43svev6g%40group.calendar.google.com/private/full'/>
|
55
|
+
<link rel='http://schemas.google.com/gCal/2005#eventFeed' type='application/atom+xml' href='https://www.google.com/calendar/feeds/rf1c66uld6dgk2t5lh43svev6g%40group.calendar.google.com/private/full'/>
|
56
|
+
<link rel='http://schemas.google.com/acl/2007#accessControlList' type='application/atom+xml' href='https://www.google.com/calendar/feeds/rf1c66uld6dgk2t5lh43svev6g%40group.calendar.google.com/acl/full'/>
|
57
|
+
<link rel='self' type='application/atom+xml' href='https://www.google.com/calendar/feeds/default/allcalendars/full/rf1c66uld6dgk2t5lh43svev6g%40group.calendar.google.com'/>
|
58
|
+
<link rel='edit' type='application/atom+xml' href='https://www.google.com/calendar/feeds/default/allcalendars/full/rf1c66uld6dgk2t5lh43svev6g%40group.calendar.google.com'/>
|
59
|
+
<author>
|
60
|
+
<name>Little Giants</name>
|
61
|
+
</author>
|
62
|
+
<gCal:timezone value='America/Los_Angeles' />
|
63
|
+
<gCal:hidden value='false' />
|
64
|
+
<gCal:color value='#5A6986' />
|
65
|
+
<gCal:selected value='false' />
|
66
|
+
<gCal:accesslevel value='owner' />
|
67
|
+
<gd:where valueString='San Francisco' />
|
68
|
+
</entry>
|
69
|
+
<entry gd:etag='W/"C0cEQnkyeip7ImA9WxRVGUo."'>
|
70
|
+
<id>http://www.google.com/calendar/feeds/default/allcalendars/full/c4o4i7m2lbamc4k26sc2vokh5g%40group.calendar.google.com</id>
|
71
|
+
<published>2007-07-11T22:10:30.297Z</published>
|
72
|
+
<updated>2007-06-05T09:38:50.000Z</updated>
|
73
|
+
<title>Google Doodles</title>
|
74
|
+
<summary type='text'/>
|
75
|
+
<link rel='alternate' type='application/atom+xml' href='https://www.google.com/calendar/feeds/c4o4i7m2lbamc4k26sc2vokh5g%40group.calendar.google.com/private/full'/>
|
76
|
+
<link rel='http://schemas.google.com/gCal/2005#eventFeed' type='application/atom+xml' href='https://www.google.com/calendar/feeds/c4o4i7m2lbamc4k26sc2vokh5g%40group.calendar.google.com/private/full'/>
|
77
|
+
<link rel='self' type='application/atom+xml' href='https://www.google.com/calendar/feeds/default/allcalendars/full/c4o4i7m2lbamc4k26sc2vokh5g%40group.calendar.google.com'/>
|
78
|
+
<link rel='edit' type='application/atom+xml' href='https://www.google.com/calendar/feeds/default/allcalendars/full/c4o4i7m2lbamc4k26sc2vokh5g%40group.calendar.google.com'/>
|
79
|
+
<author>
|
80
|
+
<name>Google Doodles</name>
|
81
|
+
</author>
|
82
|
+
<gCal:timezone value='Etc/GMT' />
|
83
|
+
<gCal:hidden value='false' />
|
84
|
+
<gCal:color value='#5229A3' />
|
85
|
+
<gCal:selected value='false' />
|
86
|
+
<gCal:accesslevel value='read' />
|
87
|
+
<gd:where valueString='' />
|
88
|
+
</entry>
|
89
|
+
</feed>
|
@@ -0,0 +1,55 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:gCal="http://schemas.google.com/gCal/2005" xmlns:gd="http://schemas.google.com/g/2005">
|
3
|
+
<id>http://www.google.com/calendar/feeds/default/private/full</id>
|
4
|
+
<updated>2010-12-10T07:09:25.000Z</updated>
|
5
|
+
<category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/g/2005#event"/>
|
6
|
+
<title type="text">Some Guy</title>
|
7
|
+
<subtitle type="text">Some Guy</subtitle>
|
8
|
+
<link rel="alternate" type="text/html" href="https://www.google.com/calendar/embed?src=some.guy@gmail.com"/>
|
9
|
+
<link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="https://www.google.com/calendar/feeds/default/private/full"/>
|
10
|
+
<link rel="http://schemas.google.com/g/2005#post" type="application/atom+xml" href="https://www.google.com/calendar/feeds/default/private/full"/>
|
11
|
+
<link rel="http://schemas.google.com/g/2005#batch" type="application/atom+xml" href="https://www.google.com/calendar/feeds/default/private/full/batch"/>
|
12
|
+
<link rel="self" type="application/atom+xml" href="https://www.google.com/calendar/feeds/default/private/full?q=Test&max-results=25"/>
|
13
|
+
<author>
|
14
|
+
<name>Some Guy</name>
|
15
|
+
<email>some.guy@gmail.com</email>
|
16
|
+
</author>
|
17
|
+
<generator version="1.0" uri="http://www.google.com/calendar">Google Calendar</generator>
|
18
|
+
<openSearch:totalResults>1</openSearch:totalResults>
|
19
|
+
<openSearch:startIndex>1</openSearch:startIndex>
|
20
|
+
<openSearch:itemsPerPage>25</openSearch:itemsPerPage>
|
21
|
+
<gCal:timezone value="America/Los_Angeles"/>
|
22
|
+
<gCal:timesCleaned value="0"/>
|
23
|
+
<entry>
|
24
|
+
<id>http://www.google.com/calendar/feeds/default/private/full/oj6fmpaulbvk9ouoj0lj4v6hio</id>
|
25
|
+
<published>2010-04-22T16:05:29.000Z</published>
|
26
|
+
<updated>2010-05-01T05:14:18.000Z</updated>
|
27
|
+
<category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/g/2005#event"/>
|
28
|
+
<title type="text">Test</title>
|
29
|
+
<content type="text"/>
|
30
|
+
<link rel="alternate" type="text/html" href="https://www.google.com/calendar/event?eid=b2o2Zm1wYXVsYnZrOW91b2owbGo0djZoaW8gc3RldmUuemljaEBt" title="alternate"/>
|
31
|
+
<link rel="self" type="application/atom+xml" href="https://www.google.com/calendar/feeds/default/private/full/oj6fmpaulbvk9ouoj0lj4v6hio"/>
|
32
|
+
<link rel="edit" type="application/atom+xml" href="https://www.google.com/calendar/feeds/default/private/full/oj6fmpaulbvk9ouoj0lj4v6hio/63408374058"/>
|
33
|
+
<author>
|
34
|
+
<name>Some Guy</name>
|
35
|
+
<email>some.guy@gmail.com</email>
|
36
|
+
</author>
|
37
|
+
<gd:comments>
|
38
|
+
<gd:feedLink href="https://www.google.com/calendar/feeds/default/private/full/oj6fmpaulbvk9ouoj0lj4v6hio/comments"/>
|
39
|
+
</gd:comments>
|
40
|
+
<gd:eventStatus value="http://schemas.google.com/g/2005#event.confirmed"/>
|
41
|
+
<gd:where valueString="At School"/>
|
42
|
+
<gd:who email="some.guy@gmail.com" rel="http://schemas.google.com/g/2005#event.organizer" valueString="some.guy@gmail.com"/>
|
43
|
+
<gd:when endTime="2010-04-09" startTime="2010-04-08">
|
44
|
+
<gd:reminder method="alert" minutes="10"/>
|
45
|
+
</gd:when>
|
46
|
+
<gd:transparency value="http://schemas.google.com/g/2005#event.transparent"/>
|
47
|
+
<gd:visibility value="http://schemas.google.com/g/2005#event.default"/>
|
48
|
+
<gCal:anyoneCanAddSelf value="false"/>
|
49
|
+
<gCal:guestsCanInviteOthers value="true"/>
|
50
|
+
<gCal:guestsCanModify value="false"/>
|
51
|
+
<gCal:guestsCanSeeGuests value="true"/>
|
52
|
+
<gCal:sequence value="0"/>
|
53
|
+
<gCal:uid value="oj6fmpaulbvk9ouoj0lj4v6hio@google.com"/>
|
54
|
+
</entry>
|
55
|
+
</feed>
|
@@ -0,0 +1,3 @@
|
|
1
|
+
SID=DQAAANQAAADZMefRbeG9x_P2llJUjewWWasEqC2mubuTSSjH414IJY-TTJF9voB3ZS80C9wFF68jKlpeUwL-9Pss9bk0_yNPCYtvTcx54L6rANjU1Go58r1X0B8RFatiA3Ak7S1zKxaUhfAB48dYoh-swUthjv_Ts8b7uCGUzfmOcKRGdQDy0-7Bdpy6r7cwVP68FPbA3EadPUrQGKKW-M4GXcB8iqymYNAL8utiGlAPtNFIM6It6uVInOiO0-24_pSYM1VxVJ2gBXa3lZevcLGObFHMQkka9Djrs2-d5OCoryjQo7RRFcxBxzZJqmwE
|
2
|
+
LSID=DQAAANUAAACgKc7kL-UwiEIsHKB-Rfd3cTPzWCav_-SzJy6e5IviYfruIvtswkDXxzSJ-rv-YmCOC-J0YO3ngnkmQoTnCJUjewWWasBIiO4bnKkk4K8IZdO8pBOHxpGuXBnKER4jaC7DwcQuVlEypBSFddj-s1mil8EQRUIR5SyRsyTbjS2uiO2slQ4jWyxGlds-s4b7DC8c7oMHuVjxrTtE_E9tZeIu4qXOb8QE1dwJGsaNWii7ioH5HVNuKMe0BjkKS5m7rymv4HhMnlN7mw09NJp1AMU9sfeiJ6kH5QVQuVxoAaA7rqm579I0pdQ
|
3
|
+
Auth=DQAAANUAAACgKc7kL-UwiEIsHKB-Rfd3cTPzWCav_-SzJy6e5IviYfruIvtswkDXxzSJ-rv-YmCOC-J0YO3ngnkmQoTnCJUjewWWasBIiO4bnKkk4K8IZdO8pBOHxpGuXBnKER4jaC7DwcQuVlEycRu6P375BUUgR1HNa3cxom45s1clzRKy9h4M4PZ2bO9ejr1qn5IkIUBuMmzvOJuDgIzm1V6YCZ_tErZ4WGq3u0tIm_VdDMn-rWEosH8OPfAp8BYShvAQy9cFSKYY1co8M0WJBbuoNlb52DnFtnUxw1UXW9d0xJ8bnSRkIUiDiMA')
|
@@ -0,0 +1,268 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestGoogleCalendar < Test::Unit::TestCase
|
4
|
+
include Google
|
5
|
+
|
6
|
+
context "Connected" do
|
7
|
+
|
8
|
+
setup do
|
9
|
+
@http_mock = mock('Net::HTTPResponse')
|
10
|
+
@http_mock.stubs(:code => '200', :kind_of? => false, :message => "OK")
|
11
|
+
@http_mock.stubs(:kind_of?).with(Net::HTTPSuccess).returns(true)
|
12
|
+
@http_mock.stubs(:body).returns(get_mock_body('successful_login.txt'))
|
13
|
+
@http_request_mock = mock('Net::HTTPS')
|
14
|
+
@http_request_mock.stubs(:set_form_data => '', :request => @http_mock)
|
15
|
+
|
16
|
+
Net::HTTPS.stubs(:new).returns(@http_request_mock)
|
17
|
+
end
|
18
|
+
|
19
|
+
context "Login" do
|
20
|
+
|
21
|
+
should "login properly" do
|
22
|
+
assert_nothing_thrown do
|
23
|
+
Calendar.new(:username => 'some.one@gmail.com', :password => 'super-secret')
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
should "catch login with invalid credentials" do
|
28
|
+
@http_mock.stubs(:kind_of?).with(Net::HTTPForbidden).returns(true)
|
29
|
+
@http_mock.stubs(:body).returns('Error=BadAuthentication')
|
30
|
+
assert_raise(HTTPAuthorizationFailed) do
|
31
|
+
Calendar.new(:username => 'some.one@gmail.com', :password => 'wrong-password')
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
should "login properly with an app_name" do
|
36
|
+
assert_nothing_thrown do
|
37
|
+
Calendar.new(:username => 'some.one@gmail.com', :password => 'super-secret',
|
38
|
+
:app_name => 'northworld.com-googlecalendar-integration'
|
39
|
+
)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
should "catch login with invalid app_name" do
|
44
|
+
@http_mock.stubs(:kind_of?).with(Net::HTTPForbidden).returns(true)
|
45
|
+
@http_mock.stubs(:body).returns('Error=BadAuthentication')
|
46
|
+
assert_raise(HTTPAuthorizationFailed) do
|
47
|
+
Calendar.new(:username => 'some.one@gmail.com', :password => 'super-secret',
|
48
|
+
:app_name => 'northworld.com-silly-cal'
|
49
|
+
)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
should "login properly with an auth_url" do
|
54
|
+
assert_nothing_thrown do
|
55
|
+
Calendar.new(:username => 'some.one@gmail.com', :password => 'super-secret',
|
56
|
+
:auth_url => "https://www.google.com/accounts/ClientLogin"
|
57
|
+
)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
should "catch login with invalid auth_url" do
|
62
|
+
@http_mock.stubs(:kind_of?).with(Net::HTTPForbidden).returns(true)
|
63
|
+
@http_mock.stubs(:body).returns('Error=BadAuthentication')
|
64
|
+
assert_raise(HTTPAuthorizationFailed) do
|
65
|
+
Calendar.new(:username => 'some.one@gmail.com', :password => 'super-secret',
|
66
|
+
:auth_url => "https://www.google.com/accounts/ClientLogin/waffles"
|
67
|
+
)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
should "login properly with a calendar" do
|
72
|
+
assert_nothing_thrown do
|
73
|
+
cal = Calendar.new(:username => 'some.one@gmail.com', :password => 'super-secret',
|
74
|
+
:calendar => "Little Giants")
|
75
|
+
|
76
|
+
#mock calendar list request
|
77
|
+
calendar_uri = mock("get calendar uri")
|
78
|
+
Addressable::URI.expects(:parse).with("https://www.google.com/calendar/feeds/default/allcalendars/full").once.returns(calendar_uri)
|
79
|
+
Connection.any_instance.expects(:send).with(calendar_uri, :get).once.returns(mock("response", :body => get_mock_body('list_calendars.xml')))
|
80
|
+
|
81
|
+
#mock events list request
|
82
|
+
events_uri = mock("get events uri")
|
83
|
+
Addressable::URI.expects(:parse).with("https://www.google.com/calendar/feeds/rf1c66uld6dgk2t5lh43svev6g%40group.calendar.google.com/private/full").once.returns(events_uri)
|
84
|
+
Connection.any_instance.expects(:send).with(events_uri, :get).once.returns(mock("response", :body => get_mock_body('events.xml')))
|
85
|
+
|
86
|
+
cal.events
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
should "catch login with invalid calendar" do
|
91
|
+
|
92
|
+
assert_raise(InvalidCalendar) do
|
93
|
+
cal = Calendar.new(:username => 'some.one@gmail.com', :password => 'super-secret',
|
94
|
+
:calendar => "invalid calendar")
|
95
|
+
|
96
|
+
#mock calendar list request
|
97
|
+
calendar_uri = mock("get calendar uri")
|
98
|
+
Addressable::URI.expects(:parse).with("https://www.google.com/calendar/feeds/default/allcalendars/full").once.returns(calendar_uri)
|
99
|
+
Connection.any_instance.expects(:send).with(calendar_uri, :get).once.returns(mock("response", :body => get_mock_body('list_calendars.xml')))
|
100
|
+
|
101
|
+
cal.events
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
end # login context
|
106
|
+
|
107
|
+
context "Logged on" do
|
108
|
+
setup do
|
109
|
+
@calendar = Calendar.new(:username => 'some.one@gmail.com', :password => 'super-secret')
|
110
|
+
end
|
111
|
+
|
112
|
+
should "reload connection" do
|
113
|
+
old_connection = @calendar.connection
|
114
|
+
assert_not_equal old_connection, @calendar.reload.connection
|
115
|
+
end
|
116
|
+
|
117
|
+
should "find all events" do
|
118
|
+
@http_mock.stubs(:body).returns( get_mock_body("events.xml") )
|
119
|
+
assert_equal @calendar.events.length, 3
|
120
|
+
end
|
121
|
+
|
122
|
+
should "query events" do
|
123
|
+
@http_mock.stubs(:body).returns( get_mock_body("query_events.xml") )
|
124
|
+
event = @calendar.find_events('Test&gsessionid=12345')
|
125
|
+
assert_equal event.title, 'Test'
|
126
|
+
end
|
127
|
+
|
128
|
+
should "find events in range" do
|
129
|
+
start_min = DateTime.new(2011, 2, 1, 11, 1, 1)
|
130
|
+
start_max = DateTime.new(2011, 2, 28, 23, 59, 59)
|
131
|
+
@calendar.expects(:event_lookup).with('?start-min=2011-02-01T11:01:01&start-max=2011-02-28T23:59:59&recurrence-expansion-start=2011-02-01T11:01:01&recurrence-expansion-end=2011-02-28T23:59:59')
|
132
|
+
events = @calendar.find_events_in_range(start_min, start_max)
|
133
|
+
end
|
134
|
+
|
135
|
+
should "find an event by id" do
|
136
|
+
@http_mock.stubs(:body).returns( get_mock_body("find_event_by_id.xml") )
|
137
|
+
event = @calendar.find_event_by_id('oj6fmpaulbvk9ouoj0lj4v6hio')
|
138
|
+
assert_equal event.id, 'oj6fmpaulbvk9ouoj0lj4v6hio'
|
139
|
+
end
|
140
|
+
|
141
|
+
should "throw NotFound with invalid event id" do
|
142
|
+
@http_mock.stubs(:kind_of?).with(Net::HTTPNotFound).returns(true)
|
143
|
+
assert_equal @calendar.find_event_by_id('1234'), nil
|
144
|
+
end
|
145
|
+
|
146
|
+
should "create an event with block" do
|
147
|
+
@http_mock.stubs(:body).returns( get_mock_body("create_event.xml") )
|
148
|
+
|
149
|
+
event = @calendar.create_event do |e|
|
150
|
+
e.title = 'New Event'
|
151
|
+
e.start_time = Time.now + (60 * 60)
|
152
|
+
e.end_time = Time.now + (60 * 60 * 2)
|
153
|
+
e.content = "A new event"
|
154
|
+
e.where = "Joe's House"
|
155
|
+
end
|
156
|
+
|
157
|
+
assert_equal event.title, 'New Event'
|
158
|
+
end
|
159
|
+
|
160
|
+
should "create a quickadd event" do
|
161
|
+
@http_mock.stubs(:body).returns( get_mock_body("create_quickadd_event.xml") )
|
162
|
+
|
163
|
+
event = @calendar.create_event do |e|
|
164
|
+
e.content = "movie tomorrow 23:00 at AMC Van Ness"
|
165
|
+
e.quickadd = true
|
166
|
+
end
|
167
|
+
|
168
|
+
assert_equal event.content, "movie tomorrow 23:00 at AMC Van Ness"
|
169
|
+
end
|
170
|
+
|
171
|
+
should "format to_s properly" do
|
172
|
+
@http_mock.stubs(:body).returns( get_mock_body("query_events.xml") )
|
173
|
+
event = @calendar.find_events('Test')
|
174
|
+
assert_equal event.to_s, "Test (oj6fmpaulbvk9ouoj0lj4v6hio)\n\t2010-04-08\n\t2010-04-09\n\tAt School\n\t"
|
175
|
+
end
|
176
|
+
|
177
|
+
should "update an event by id" do
|
178
|
+
@http_mock.stubs(:body).returns( get_mock_body("find_event_by_id.xml") )
|
179
|
+
|
180
|
+
event = @calendar.find_or_create_event_by_id('oj6fmpaulbvk9ouoj0lj4v6hio') do |e|
|
181
|
+
e.title = 'New Event Update'
|
182
|
+
end
|
183
|
+
|
184
|
+
assert_equal event.title, 'New Event Update'
|
185
|
+
end
|
186
|
+
|
187
|
+
should "delete an event" do
|
188
|
+
@http_mock.stubs(:body).returns( get_mock_body("create_event.xml") )
|
189
|
+
|
190
|
+
event = @calendar.create_event do |e|
|
191
|
+
e.title = 'Delete Me'
|
192
|
+
end
|
193
|
+
|
194
|
+
assert_equal event.id, 'b1vq6rj4r4mg85kcickc7iomb0'
|
195
|
+
|
196
|
+
@http_mock.stubs(:body).returns("")
|
197
|
+
event.delete
|
198
|
+
assert_equal event.id, nil
|
199
|
+
end
|
200
|
+
|
201
|
+
should "not redirect forever" do
|
202
|
+
@http_mock.stubs(:kind_of?).with(Net::HTTPRedirection).returns(true)
|
203
|
+
@http_mock.stubs(:[]).with('location').returns('https://www.google.com')
|
204
|
+
assert_raise(HTTPTooManyRedirections) do
|
205
|
+
@calendar.events
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
should "throw exception on bad request" do
|
210
|
+
@http_mock.stubs(:kind_of?).with(Net::HTTPBadRequest).returns(true)
|
211
|
+
assert_raise(HTTPRequestFailed) do
|
212
|
+
@calendar.events
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
end # Logged on context
|
217
|
+
|
218
|
+
end # Connected context
|
219
|
+
|
220
|
+
context "Event instance methods" do
|
221
|
+
context "#all_day?" do
|
222
|
+
context "when the event is 24 hours long or more" do
|
223
|
+
should "be true" do
|
224
|
+
@event = Event.new(:start_time => "2012-03-31", :end_time => "2012-04-01")
|
225
|
+
assert @event.all_day?
|
226
|
+
end
|
227
|
+
end
|
228
|
+
context "when the event is not an all-day event" do
|
229
|
+
should "be false" do
|
230
|
+
@event = Event.new(:start_time => "2012-03-27T10:00:00.000-07:00", :end_time => "2012-03-27T10:30:00.000-07:00")
|
231
|
+
assert !@event.all_day?
|
232
|
+
end
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
236
|
+
context "#all_day=" do
|
237
|
+
context "sets the start and end time to the appropriate values for an all day event on that day" do
|
238
|
+
should "set the start time" do
|
239
|
+
@event = Event.new :all_day => Time.parse("2012-05-02 12:24")
|
240
|
+
assert_equal @event.start_time, "2012-05-02"
|
241
|
+
end
|
242
|
+
should "set the end time" do
|
243
|
+
@event = Event.new :all_day => Time.parse("2012-05-02 12:24")
|
244
|
+
assert_equal @event.end_time, "2012-05-03"
|
245
|
+
end
|
246
|
+
should "be able to handle strings" do
|
247
|
+
@event = Event.new :all_day => "2012-05-02 12:24"
|
248
|
+
assert_equal @event.start_time, "2012-05-02"
|
249
|
+
assert_equal @event.end_time, "2012-05-03"
|
250
|
+
end
|
251
|
+
end
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
def test_https_extension
|
256
|
+
assert_nothing_thrown do
|
257
|
+
uri = Addressable::URI.parse('https://www.google.com')
|
258
|
+
Net::HTTPS.new(uri.host, uri.port)
|
259
|
+
end
|
260
|
+
end
|
261
|
+
|
262
|
+
protected
|
263
|
+
|
264
|
+
def get_mock_body(name)
|
265
|
+
File.open(@@mock_path + '/' + name).read
|
266
|
+
end
|
267
|
+
|
268
|
+
end
|