ics_validator 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.coveralls.yml +1 -0
- data/Gemfile +2 -0
- data/README.md +13 -3
- data/lib/ics_validator/api_response.rb +26 -0
- data/lib/ics_validator/version.rb +1 -1
- data/lib/ics_validator/web_session.rb +41 -0
- data/lib/ics_validator.rb +12 -6
- data/spec/cassettes/IcsValidator/_valid_feed_url_/given_a_valid_ICS_feed/returns_true.yml +256 -0
- data/spec/cassettes/{IcsValidator_FeedValidator/given_an_invalid_ICS_feed/_valid_ → IcsValidator/_valid_feed_url_/given_an_invalid_ICS_feed}/returns_false.yml +4 -4
- data/spec/ics_validator_spec.rb +113 -0
- data/spec/spec_helper.rb +4 -1
- metadata +10 -14
- data/lib/ics_validator/feed_validator.rb +0 -40
- data/lib/ics_validator/file_validator.rb +0 -49
- data/lib/ics_validator/snippet_validator.rb +0 -48
- data/spec/cassettes/IcsValidator_FeedValidator/given_a_valid_ICS_feed/_valid_/returns_true.yml +0 -256
- data/spec/ics_validator/feed_validator_spec.rb +0 -33
- data/spec/ics_validator/file_validator_spec.rb +0 -33
- data/spec/ics_validator/snippet_validator_spec.rb +0 -57
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3249f96eb2cf709c4b6e9830d7d8a20aca8ed6cf
|
4
|
+
data.tar.gz: 2f246a81f10745def035c8d62efac59b01f70dd7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0d6fedeea266e83773102b4136eda9a5eb237653d5dd3f6e59d9abd16b57e31db8c227a28c17a128364c787c1ade18695e02adddc75b2493362bb00b31887155
|
7
|
+
data.tar.gz: b998aadfa0fa5ebb46f3ccedaeefcbd87ff54e879722b6ddd6880352e16845d4f6360d70ee662f197c1a479bb336d9048d133a0a0865ad11058d14da5bc0c845
|
data/.coveralls.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
repo_token: POVJtaPdxTb2L4HoSBmMc19qnPt2ZopOp
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,12 +1,15 @@
|
|
1
1
|
# IcsValidator
|
2
2
|
|
3
3
|
[![Build Status](https://travis-ci.org/mattgillooly/ics_validator.png?branch=master)](https://travis-ci.org/mattgillooly/ics_validator)
|
4
|
+
[![Gem Version](https://badge.fury.io/rb/ics_validator.png)](http://badge.fury.io/rb/ics_validator)
|
5
|
+
[![Code Climate](https://codeclimate.com/github/mattgillooly/ics_validator.png)](https://codeclimate.com/github/mattgillooly/ics_validator)
|
6
|
+
[![Coverage Status](https://coveralls.io/repos/mattgillooly/ics_validator/badge.png)](https://coveralls.io/r/mattgillooly/ics_validator)
|
4
7
|
|
5
|
-
Validate iCalendar
|
8
|
+
Validate iCalendar content, using [http://icalvalid.cloudapp.net/](http://icalvalid.cloudapp.net/).
|
9
|
+
If this gem reports a failed validation, your best bet is to manually re-validate your content via the website for more actionable feedback.
|
6
10
|
|
7
|
-
Used by [http://pvdtechevents.com](http://pvdtechevents.com) to validate its generated feed.
|
11
|
+
Used by [http://pvdtechevents.com/](http://pvdtechevents.com/) to validate its generated feed.
|
8
12
|
|
9
|
-
TODO: Support validating iCalendar snippets and files.
|
10
13
|
|
11
14
|
## Installation
|
12
15
|
|
@@ -25,8 +28,15 @@ Or install it yourself as:
|
|
25
28
|
## Usage
|
26
29
|
|
27
30
|
```ruby
|
31
|
+
# validate an online feed by URL
|
28
32
|
IcsValidator.valid_feed?("http://example.com/valid_feed.ics") # => true
|
29
33
|
IcsValidator.valid_feed?("http://example.com/invalid_feed.ics") # => false
|
34
|
+
|
35
|
+
# validate a String snippet of iCalendar content
|
36
|
+
IcsValidator.valid_snippet?("BEGIN:VCALENDAR...")
|
37
|
+
|
38
|
+
# validate an iCalendar file
|
39
|
+
IcsValidator.valid_file?("path/to/local/feed.ics")
|
30
40
|
```
|
31
41
|
|
32
42
|
## Contributing
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'nokogiri'
|
2
|
+
|
3
|
+
module IcsValidator
|
4
|
+
|
5
|
+
# Response from icalvalid.cloudapp.net API
|
6
|
+
#
|
7
|
+
class ApiResponse
|
8
|
+
|
9
|
+
def self.build(markup)
|
10
|
+
doc = Nokogiri::XML(markup)
|
11
|
+
new(doc.at('validationResults'))
|
12
|
+
end
|
13
|
+
|
14
|
+
def initialize(validation_results)
|
15
|
+
@validation_results = validation_results
|
16
|
+
end
|
17
|
+
|
18
|
+
def valid?
|
19
|
+
results = @validation_results.children.map{|c| c.attr(:result)}
|
20
|
+
results.compact.uniq == ['pass']
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'capybara/poltergeist'
|
2
|
+
require 'ics_validator/api_response'
|
3
|
+
|
4
|
+
module IcsValidator
|
5
|
+
|
6
|
+
# Capybara session for interacting with icalvalid.cloudapp.net
|
7
|
+
#
|
8
|
+
class WebSession
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@session = Capybara::Session.new(:poltergeist)
|
12
|
+
|
13
|
+
@session.driver.headers = {
|
14
|
+
'User-Agent' => "Mozilla/5.0 (Macintosh; Intel Mac OS X)"
|
15
|
+
}
|
16
|
+
|
17
|
+
@session.visit('http://icalvalid.cloudapp.net/')
|
18
|
+
end
|
19
|
+
|
20
|
+
def validate_snippet(snippet)
|
21
|
+
@session.fill_in('Content_tbSnippet', with: snippet)
|
22
|
+
@session.click_button "Content_btnValidateSnippet"
|
23
|
+
end
|
24
|
+
|
25
|
+
def validate_file(path)
|
26
|
+
@session.attach_file('Content_fileUpload', path)
|
27
|
+
@session.click_button "Content_btnUpload"
|
28
|
+
end
|
29
|
+
|
30
|
+
def get_api_response
|
31
|
+
response = nil
|
32
|
+
|
33
|
+
Capybara.send(:timeout, 20, @session.driver) do
|
34
|
+
response = ApiResponse.build(@session.html)
|
35
|
+
end
|
36
|
+
|
37
|
+
response
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
data/lib/ics_validator.rb
CHANGED
@@ -1,22 +1,28 @@
|
|
1
1
|
require "ics_validator/version"
|
2
|
-
require "ics_validator/
|
3
|
-
require "ics_validator/
|
4
|
-
require "
|
2
|
+
require "ics_validator/web_session"
|
3
|
+
require "ics_validator/api_response"
|
4
|
+
require "rest-client"
|
5
5
|
|
6
6
|
# Use http://icalvalid.cloudapp.net/ to validate iCalendar content.
|
7
7
|
#
|
8
8
|
module IcsValidator
|
9
9
|
|
10
10
|
def self.valid_feed?(url)
|
11
|
-
|
11
|
+
ApiResponse.build(
|
12
|
+
RestClient.get("http://icalvalid.cloudapp.net/?uri=#{url}")
|
13
|
+
).valid?
|
12
14
|
end
|
13
15
|
|
14
16
|
def self.valid_snippet?(snippet)
|
15
|
-
|
17
|
+
session = WebSession.new
|
18
|
+
session.validate_snippet(snippet)
|
19
|
+
session.get_api_response.valid?
|
16
20
|
end
|
17
21
|
|
18
22
|
def self.valid_file?(path)
|
19
|
-
|
23
|
+
session = WebSession.new
|
24
|
+
session.validate_file(File.expand_path(path))
|
25
|
+
session.get_api_response.valid?
|
20
26
|
end
|
21
27
|
|
22
28
|
end
|
@@ -0,0 +1,256 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: http://icalvalid.cloudapp.net/?uri=http://elmcity.cloudapp.net/elmcity/ics?view=art
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
Accept:
|
11
|
+
- '*/*; q=0.5, application/xml'
|
12
|
+
Accept-Encoding:
|
13
|
+
- gzip, deflate
|
14
|
+
User-Agent:
|
15
|
+
- Ruby
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 200
|
19
|
+
message: OK
|
20
|
+
headers:
|
21
|
+
Cache-Control:
|
22
|
+
- private
|
23
|
+
Content-Type:
|
24
|
+
- text/xml; charset=utf-8
|
25
|
+
Server:
|
26
|
+
- Microsoft-IIS/7.0
|
27
|
+
X-Aspnet-Version:
|
28
|
+
- 4.0.30319
|
29
|
+
X-Powered-By:
|
30
|
+
- ASP.NET
|
31
|
+
Date:
|
32
|
+
- Thu, 02 Jan 2014 06:46:51 GMT
|
33
|
+
Content-Length:
|
34
|
+
- '9691'
|
35
|
+
body:
|
36
|
+
encoding: ASCII-8BIT
|
37
|
+
string: !binary |-
|
38
|
+
77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjw/
|
39
|
+
eG1sLXN0eWxlc2hlZXQgdHlwZT0idGV4dC94c2wiIGhyZWY9InJlc3VsdHMu
|
40
|
+
eHNsdCI/Pg0KPHJlc3VsdHMNCiAgICBsYW5ndWFnZT0iZW4iDQogICAgZGF0
|
41
|
+
ZXRpbWU9IjIwMTQtMDEtMDJUMDY6NDY6NDkiDQogICAgcGVybWFsaW5rPSIv
|
42
|
+
P2lkPTYzNTI0MjQyMDA5MTQ4MzgyOSIgeG1sbnM9Imh0dHA6Ly9pY2FsdmFs
|
43
|
+
aWQud2lraWRvdC5jb20vdmFsaWRhdGlvbiI+DQogICAgPHVzaW5nDQogICAg
|
44
|
+
ICAgIG5hbWU9IkREYXkuaUNhbCINCiAgICAgICAgdXJsPSJodHRwOi8vd3d3
|
45
|
+
LmRkYXlzb2Z0d2FyZS5jb20vUGFnZXMvUHJvamVjdHMvRERheS5pQ2FsLyIN
|
46
|
+
CiAgICAgICAgdmVyc2lvbj0iMS4wLjEuMCIgLz4NCiAgICA8dXNpbmcNCiAg
|
47
|
+
ICAgICAgbmFtZT0iaWNhbHZhbGlkIg0KICAgICAgICB1cmw9Imh0dHA6Ly9p
|
48
|
+
Y2FsdmFsaWQuY2xvdWRhcHAubmV0Ig0KICAgICAgICB2ZXJzaW9uPSIxLjAu
|
49
|
+
MC4zIiAvPg0KICAgIDxjYWxlbmRhckxpbmVzDQogICAgICAgIHBhdGg9Imh0
|
50
|
+
dHA6Ly9lbG1jaXR5LmNsb3VkYXBwLm5ldC9lbG1jaXR5L2ljcz92aWV3PWFy
|
51
|
+
dCINCiAgICAgICAgYnl0ZUNvdW50PSIxOTU4Ig0KICAgICAgICBsaW1pdD0i
|
52
|
+
NTAwIj4NCiAgICAgICAgPGxpbmUNCiAgICAgICAgICAgIG49IjEiPkJFR0lO
|
53
|
+
OlZDQUxFTkRBUjwvbGluZT4NCiAgICAgICAgPGxpbmUNCiAgICAgICAgICAg
|
54
|
+
IG49IjIiPlZFUlNJT046Mi4wPC9saW5lPg0KICAgICAgICA8bGluZQ0KICAg
|
55
|
+
ICAgICAgICAgbj0iMyI+UFJPRElEOi0vL2RkYXlzb2Z0d2FyZS5jb20vL05P
|
56
|
+
TlNHTUwgRERheS5pQ2FsIDEuMC8vRU48L2xpbmU+DQogICAgICAgIDxsaW5l
|
57
|
+
DQogICAgICAgICAgICBuPSI0Ij5CRUdJTjpWVElNRVpPTkU8L2xpbmU+DQog
|
58
|
+
ICAgICAgIDxsaW5lDQogICAgICAgICAgICBuPSI1Ij5UWklEOkVhc3Rlcm4g
|
59
|
+
U3RhbmRhcmQgVGltZTwvbGluZT4NCiAgICAgICAgPGxpbmUNCiAgICAgICAg
|
60
|
+
ICAgIG49IjYiPkJFR0lOOlNUQU5EQVJEPC9saW5lPg0KICAgICAgICA8bGlu
|
61
|
+
ZQ0KICAgICAgICAgICAgbj0iNyI+RFRTVEFSVDoyMDEzMTEwMlQwMjAwMDA8
|
62
|
+
L2xpbmU+DQogICAgICAgIDxsaW5lDQogICAgICAgICAgICBuPSI4Ij5SUlVM
|
63
|
+
RTpGUkVRPVlFQVJMWTtCWURBWT0xU1U7QllIT1VSPTI7QllNSU5VVEU9MDtC
|
64
|
+
WU1PTlRIPTExPC9saW5lPg0KICAgICAgICA8bGluZQ0KICAgICAgICAgICAg
|
65
|
+
bj0iOSI+VFpOQU1FOkVhc3Rlcm4gU3RhbmRhcmQgVGltZTwvbGluZT4NCiAg
|
66
|
+
ICAgICAgPGxpbmUNCiAgICAgICAgICAgIG49IjEwIj5UWk9GRlNFVEZST006
|
67
|
+
LTA0MDA8L2xpbmU+DQogICAgICAgIDxsaW5lDQogICAgICAgICAgICBuPSIx
|
68
|
+
MSI+VFpPRkZTRVRUTzotMDUwMDwvbGluZT4NCiAgICAgICAgPGxpbmUNCiAg
|
69
|
+
ICAgICAgICAgIG49IjEyIj5FTkQ6U1RBTkRBUkQ8L2xpbmU+DQogICAgICAg
|
70
|
+
IDxsaW5lDQogICAgICAgICAgICBuPSIxMyI+QkVHSU46REFZTElHSFQ8L2xp
|
71
|
+
bmU+DQogICAgICAgIDxsaW5lDQogICAgICAgICAgICBuPSIxNCI+RFRTVEFS
|
72
|
+
VDoyMDEzMDMwMVQwMjAwMDA8L2xpbmU+DQogICAgICAgIDxsaW5lDQogICAg
|
73
|
+
ICAgICAgICBuPSIxNSI+UlJVTEU6RlJFUT1ZRUFSTFk7QllEQVk9MlNVO0JZ
|
74
|
+
SE9VUj0yO0JZTUlOVVRFPTA7QllNT05USD0zPC9saW5lPg0KICAgICAgICA8
|
75
|
+
bGluZQ0KICAgICAgICAgICAgbj0iMTYiPlRaTkFNRTpFYXN0ZXJuIERheWxp
|
76
|
+
Z2h0IFRpbWU8L2xpbmU+DQogICAgICAgIDxsaW5lDQogICAgICAgICAgICBu
|
77
|
+
PSIxNyI+VFpPRkZTRVRGUk9NOi0wNTAwPC9saW5lPg0KICAgICAgICA8bGlu
|
78
|
+
ZQ0KICAgICAgICAgICAgbj0iMTgiPlRaT0ZGU0VUVE86LTA0MDA8L2xpbmU+
|
79
|
+
DQogICAgICAgIDxsaW5lDQogICAgICAgICAgICBuPSIxOSI+RU5EOkRBWUxJ
|
80
|
+
R0hUPC9saW5lPg0KICAgICAgICA8bGluZQ0KICAgICAgICAgICAgbj0iMjAi
|
81
|
+
PkVORDpWVElNRVpPTkU8L2xpbmU+DQogICAgICAgIDxsaW5lDQogICAgICAg
|
82
|
+
ICAgICBuPSIyMSI+QkVHSU46VkVWRU5UPC9saW5lPg0KICAgICAgICA8bGlu
|
83
|
+
ZQ0KICAgICAgICAgICAgbj0iMjIiPkNBVEVHT1JJRVM6YXJ0PC9saW5lPg0K
|
84
|
+
ICAgICAgICA8bGluZQ0KICAgICAgICAgICAgbj0iMjMiPkNBVEVHT1JJRVM6
|
85
|
+
a3NjPC9saW5lPg0KICAgICAgICA8bGluZQ0KICAgICAgICAgICAgbj0iMjQi
|
86
|
+
PkNBVEVHT1JJRVM6dW5pdmVyc2l0eTwvbGluZT4NCiAgICAgICAgPGxpbmUN
|
87
|
+
CiAgICAgICAgICAgIG49IjI1Ij5ERVNDUklQVElPTjoyMDEzw6/Cv8K9MTQg
|
88
|
+
UmVkZmVybiBDaG9yZW9ncmFwaGVyLWluLVJlc2lkZW5jZSBSZWJlY2NhIFN0
|
89
|
+
ZW5uIGhhcyBwZTwvbGluZT4NCiAgICAgICAgPGxpbmUNCiAgICAgICAgICAg
|
90
|
+
IG49IjI2Ij4gcmZvcm1lZCBhbmQgdG91cmVkIHRocm91Z2hvdXQgdGhlIHdv
|
91
|
+
cmxkIGFzIGEgcHJpbmNpcGFsIGRhbmNlciB3aXRoIE1vbWl4IGE8L2xpbmU+
|
92
|
+
DQogICAgICAgIDxsaW5lDQogICAgICAgICAgICBuPSIyNyI+IG5kIFBpbG9i
|
93
|
+
b2x1cy4gU3Rlbm4gY3JlYXRlcyBkaXN0aW5jdGl2ZSBkYW5jZSBwaWVjZXMg
|
94
|
+
YW5kIHNvbG8gd29ya3MgdGhhdCBjPC9saW5lPg0KICAgICAgICA8bGluZQ0K
|
95
|
+
ICAgICAgICAgICAgbj0iMjgiPiBoYWxsZW5nZSB0aGUgdW5pcXVlIHdheXMg
|
96
|
+
dGhhdCBsaXZlIG11c2ljIGFuZCBkYW5jZVxuY29tbXVuaWNhdGUgYW5kIGlu
|
97
|
+
dGVyYTwvbGluZT4NCiAgICAgICAgPGxpbmUNCiAgICAgICAgICAgIG49IjI5
|
98
|
+
Ij4gY3QuPC9saW5lPg0KICAgICAgICA8bGluZQ0KICAgICAgICAgICAgbj0i
|
99
|
+
MzAiPkRURU5EO1RaSUQ9RWFzdGVybiBTdGFuZGFyZCBUaW1lOjIwMTQwMTI3
|
100
|
+
VDIxMzAwMDwvbGluZT4NCiAgICAgICAgPGxpbmUNCiAgICAgICAgICAgIG49
|
101
|
+
IjMxIj5EVFNUQU1QOjIwMTQwMTAyVDA2MjEyN1o8L2xpbmU+DQogICAgICAg
|
102
|
+
IDxsaW5lDQogICAgICAgICAgICBuPSIzMiI+RFRTVEFSVDtUWklEPUVhc3Rl
|
103
|
+
cm4gU3RhbmRhcmQgVGltZToyMDE0MDEyN1QxOTMwMDA8L2xpbmU+DQogICAg
|
104
|
+
ICAgIDxsaW5lDQogICAgICAgICAgICBuPSIzMyI+TE9DQVRJT046PC9saW5l
|
105
|
+
Pg0KICAgICAgICA8bGluZQ0KICAgICAgICAgICAgbj0iMzQiPlNFUVVFTkNF
|
106
|
+
OjA8L2xpbmU+DQogICAgICAgIDxsaW5lDQogICAgICAgICAgICBuPSIzNSI+
|
107
|
+
U1VNTUFSWTpSZWJlY2NhIFN0ZW5uIE1vZGVybiBEYW5jZTwvbGluZT4NCiAg
|
108
|
+
ICAgICAgPGxpbmUNCiAgICAgICAgICAgIG49IjM2Ij5VSUQ6MmYxMDEzZjEt
|
109
|
+
ZjEwMy00ZWY4LTk2NDgtZTdjNjRmNDM5NzdiPC9saW5lPg0KICAgICAgICA8
|
110
|
+
bGluZQ0KICAgICAgICAgICAgbj0iMzciPlVSTDpodHRwOi8vd3d3LmtlZW5l
|
111
|
+
LmVkdS9uZXdzL2V2ZW50cy9kZXRhaWwvMTIzMi88L2xpbmU+DQogICAgICAg
|
112
|
+
IDxsaW5lDQogICAgICAgICAgICBuPSIzOCI+RU5EOlZFVkVOVDwvbGluZT4N
|
113
|
+
CiAgICAgICAgPGxpbmUNCiAgICAgICAgICAgIG49IjM5Ij5CRUdJTjpWRVZF
|
114
|
+
TlQ8L2xpbmU+DQogICAgICAgIDxsaW5lDQogICAgICAgICAgICBuPSI0MCI+
|
115
|
+
Q0FURUdPUklFUzphcnQ8L2xpbmU+DQogICAgICAgIDxsaW5lDQogICAgICAg
|
116
|
+
ICAgICBuPSI0MSI+Q0FURUdPUklFUzprc2M8L2xpbmU+DQogICAgICAgIDxs
|
117
|
+
aW5lDQogICAgICAgICAgICBuPSI0MiI+Q0FURUdPUklFUzp0aGVhdGVyPC9s
|
118
|
+
aW5lPg0KICAgICAgICA8bGluZQ0KICAgICAgICAgICAgbj0iNDMiPkNBVEVH
|
119
|
+
T1JJRVM6dW5pdmVyc2l0eTwvbGluZT4NCiAgICAgICAgPGxpbmUNCiAgICAg
|
120
|
+
ICAgICAgIG49IjQ0Ij5ERVNDUklQVElPTjpJbiB0aGVpciBwcmVtaWVyZSBB
|
121
|
+
bWVyaWNhbiB0b3VyXCwgdGhpcyBoaWxhcmlvdXMgY2lyY3VzXG50cm91cGU8
|
122
|
+
L2xpbmU+DQogICAgICAgIDxsaW5lDQogICAgICAgICAgICBuPSI0NSI+ICBm
|
123
|
+
ZWF0dXJlcyBsb2ctd2Fsa2luZ1wsIHNwb29uLWNsYWNraW5nXCwgaGF0Y2hl
|
124
|
+
dC1qdWdnbGluZ1wsIGNsb2ctZGFuY2luZ1wsPC9saW5lPg0KICAgICAgICA8
|
125
|
+
bGluZQ0KICAgICAgICAgICAgbj0iNDYiPiAgYW5kIGV2ZW4gaGlqaW5rcyBv
|
126
|
+
biBhbiBvdXRob3VzZSEgQSBzbW9yZ2FzYm9yZCBvZiBmYW1pbHkgZnVuIGJh
|
127
|
+
c2VkIG9uIHRoZTwvbGluZT4NCiAgICAgICAgPGxpbmUNCiAgICAgICAgICAg
|
128
|
+
IG49IjQ3Ij4gIGxvZ2dpbmcgdHJhZGl0aW9uIHdpdGggdHJvdXBlcnMgcGVy
|
129
|
+
Zm9ybWluZyBkYXJpbmcga25pZmUgdHJpY2tzIGFuZCBhY3JvYmE8L2xpbmU+
|
130
|
+
DQogICAgICAgIDxsaW5lDQogICAgICAgICAgICBuPSI0OCI+IHRpYyBmZWF0
|
131
|
+
cyB0byB0aGUgdG9lLXRhcHBpbmcgc291bmRzIG9mIFF1ZWJlY29pcyBmb2xr
|
132
|
+
IG11c2ljLjwvbGluZT4NCiAgICAgICAgPGxpbmUNCiAgICAgICAgICAgIG49
|
133
|
+
IjQ5Ij5EVEVORDtUWklEPUVhc3Rlcm4gU3RhbmRhcmQgVGltZToyMDE0MDIw
|
134
|
+
MVQxNjAwMDA8L2xpbmU+DQogICAgICAgIDxsaW5lDQogICAgICAgICAgICBu
|
135
|
+
PSI1MCI+RFRTVEFNUDoyMDE0MDEwMlQwNjIxMjdaPC9saW5lPg0KICAgICAg
|
136
|
+
ICA8bGluZQ0KICAgICAgICAgICAgbj0iNTEiPkRUU1RBUlQ7VFpJRD1FYXN0
|
137
|
+
ZXJuIFN0YW5kYXJkIFRpbWU6MjAxNDAyMDFUMTQwMDAwPC9saW5lPg0KICAg
|
138
|
+
ICAgICA8bGluZQ0KICAgICAgICAgICAgbj0iNTIiPkxPQ0FUSU9OOjwvbGlu
|
139
|
+
ZT4NCiAgICAgICAgPGxpbmUNCiAgICAgICAgICAgIG49IjUzIj5TRVFVRU5D
|
140
|
+
RTowPC9saW5lPg0KICAgICAgICA8bGluZQ0KICAgICAgICAgICAgbj0iNTQi
|
141
|
+
PlNVTU1BUlk6Q2lycXVlIEFsZm9uc2UgaW4gIlRpbWJlciEiPC9saW5lPg0K
|
142
|
+
ICAgICAgICA8bGluZQ0KICAgICAgICAgICAgbj0iNTUiPlVJRDoyYzgyZGQz
|
143
|
+
OC05N2ZmLTRhZDAtOTg3OS00ZDllZDQxZWJiYzU8L2xpbmU+DQogICAgICAg
|
144
|
+
IDxsaW5lDQogICAgICAgICAgICBuPSI1NiI+VVJMOmh0dHA6Ly93d3cua2Vl
|
145
|
+
bmUuZWR1L25ld3MvZXZlbnRzL2RldGFpbC8xMjMzLzwvbGluZT4NCiAgICAg
|
146
|
+
ICAgPGxpbmUNCiAgICAgICAgICAgIG49IjU3Ij5FTkQ6VkVWRU5UPC9saW5l
|
147
|
+
Pg0KICAgICAgICA8bGluZQ0KICAgICAgICAgICAgbj0iNTgiPkVORDpWQ0FM
|
148
|
+
RU5EQVI8L2xpbmU+DQogICAgPC9jYWxlbmRhckxpbmVzPg0KICAgIDx2YWxp
|
149
|
+
ZGF0aW9uUmVzdWx0cw0KICAgICAgICBydWxlc2V0PSJTdHJpY3RfMl8wIg0K
|
150
|
+
ICAgICAgICBydWxlc2V0U3RyaW5nPSJpQ2FsZW5kYXIgMi4wIFN0cmljdCIN
|
151
|
+
CiAgICAgICAgcnVsZXNldERlc2NyaXB0aW9uPSImI3hEOyYjeEE7ICAgICAg
|
152
|
+
ICBWYWxpZGF0ZXMgaUNhbGVuZGFycyBhZ2FpbnN0IHRoZSBJRVRGIHN0YW5k
|
153
|
+
YXJkcyBpbiBhIHN0cmljdCBmYXNoaW9uLiAgQW55IHZhcmlhdGlvbnMgZnJv
|
154
|
+
bSB0aGUgc3RhbmRhcmQmI3hEOyYjeEE7ICAgICAgICB3aWxsIGJlIHJlcG9y
|
155
|
+
dGVkLiYjeEQ7JiN4QTsgICAgIg0KICAgICAgICBzY29yZT0iMTAwIj4NCiAg
|
156
|
+
ICAgICAgPGNhbGVuZGFySW5mb3M+DQogICAgICAgICAgICA8Y2FsZW5kYXJJ
|
157
|
+
bmZvDQogICAgICAgICAgICAgICAgdGltZVpvbmVDb3VudD0iMSINCiAgICAg
|
158
|
+
ICAgICAgICAgICBldmVudENvdW50PSIyIg0KICAgICAgICAgICAgICAgIHRv
|
159
|
+
ZG9Db3VudD0iMCINCiAgICAgICAgICAgICAgICBqb3VybmFsQ291bnQ9IjAi
|
160
|
+
DQogICAgICAgICAgICAgICAgZnJlZUJ1c3lDb3VudD0iMCINCiAgICAgICAg
|
161
|
+
ICAgICAgICBjYWxlbmRhclZlcnNpb249IjIuMCINCiAgICAgICAgICAgICAg
|
162
|
+
ICBwcm9kSUQ9Ii0vL2RkYXlzb2Z0d2FyZS5jb20vL05PTlNHTUwgRERheS5p
|
163
|
+
Q2FsIDEuMC8vRU4iIC8+DQogICAgICAgIDwvY2FsZW5kYXJJbmZvcz4NCiAg
|
164
|
+
ICAgICAgPHZhbGlkYXRpb25SZXN1bHQNCiAgICAgICAgICAgIHJ1bGU9ImVt
|
165
|
+
cHR5TGluZSINCiAgICAgICAgICAgIHJlc3VsdD0icGFzcyIgLz4NCiAgICAg
|
166
|
+
ICAgPHZhbGlkYXRpb25SZXN1bHQNCiAgICAgICAgICAgIHJ1bGU9ImNybGZQ
|
167
|
+
YWlycyINCiAgICAgICAgICAgIHJlc3VsdD0icGFzcyIgLz4NCiAgICAgICAg
|
168
|
+
PHZhbGlkYXRpb25SZXN1bHQNCiAgICAgICAgICAgIHJ1bGU9ImxpbmVGb2xk
|
169
|
+
aW5nIg0KICAgICAgICAgICAgcmVzdWx0PSJwYXNzIiAvPg0KICAgICAgICA8
|
170
|
+
dmFsaWRhdGlvblJlc3VsdA0KICAgICAgICAgICAgcnVsZT0idmVyc2lvbiIN
|
171
|
+
CiAgICAgICAgICAgIHJlc3VsdD0icGFzcyIgLz4NCiAgICAgICAgPHZhbGlk
|
172
|
+
YXRpb25SZXN1bHQNCiAgICAgICAgICAgIHJ1bGU9InByb2RJRCINCiAgICAg
|
173
|
+
ICAgICAgIHJlc3VsdD0icGFzcyIgLz4NCiAgICAgICAgPHZhbGlkYXRpb25S
|
174
|
+
ZXN1bHQNCiAgICAgICAgICAgIHJ1bGU9ImNhbFNjYWxlIg0KICAgICAgICAg
|
175
|
+
ICAgcmVzdWx0PSJwYXNzIiAvPg0KICAgICAgICA8dmFsaWRhdGlvblJlc3Vs
|
176
|
+
dA0KICAgICAgICAgICAgcnVsZT0ibWV0aG9kIg0KICAgICAgICAgICAgcmVz
|
177
|
+
dWx0PSJwYXNzIiAvPg0KICAgICAgICA8dmFsaWRhdGlvblJlc3VsdA0KICAg
|
178
|
+
ICAgICAgICAgcnVsZT0iY29tcG9uZW50Ig0KICAgICAgICAgICAgcmVzdWx0
|
179
|
+
PSJwYXNzIiAvPg0KICAgICAgICA8dmFsaWRhdGlvblJlc3VsdA0KICAgICAg
|
180
|
+
ICAgICAgcnVsZT0iIg0KICAgICAgICAgICAgcmVzdWx0PSJwYXNzIiAvPg0K
|
181
|
+
ICAgICAgICA8dmFsaWRhdGlvblJlc3VsdA0KICAgICAgICAgICAgcnVsZT0i
|
182
|
+
ZXZlbnRBdHRhY2hQcm9wZXJ0eSINCiAgICAgICAgICAgIHJlc3VsdD0icGFz
|
183
|
+
cyIgLz4NCiAgICAgICAgPHZhbGlkYXRpb25SZXN1bHQNCiAgICAgICAgICAg
|
184
|
+
IHJ1bGU9ImV2ZW50QXR0ZW5kZWVQcm9wZXJ0eSINCiAgICAgICAgICAgIHJl
|
185
|
+
c3VsdD0icGFzcyIgLz4NCiAgICAgICAgPHZhbGlkYXRpb25SZXN1bHQNCiAg
|
186
|
+
ICAgICAgICAgIHJ1bGU9ImV2ZW50Q2F0ZWdvcmllc1Byb3BlcnR5Ig0KICAg
|
187
|
+
ICAgICAgICAgcmVzdWx0PSJwYXNzIiAvPg0KICAgICAgICA8dmFsaWRhdGlv
|
188
|
+
blJlc3VsdA0KICAgICAgICAgICAgcnVsZT0iZXZlbnRDbGFzc1Byb3BlcnR5
|
189
|
+
Ig0KICAgICAgICAgICAgcmVzdWx0PSJwYXNzIiAvPg0KICAgICAgICA8dmFs
|
190
|
+
aWRhdGlvblJlc3VsdA0KICAgICAgICAgICAgcnVsZT0iZXZlbnRDb21tZW50
|
191
|
+
UHJvcGVydHkiDQogICAgICAgICAgICByZXN1bHQ9InBhc3MiIC8+DQogICAg
|
192
|
+
ICAgIDx2YWxpZGF0aW9uUmVzdWx0DQogICAgICAgICAgICBydWxlPSJldmVu
|
193
|
+
dENvbnRhY3RQcm9wZXJ0eSINCiAgICAgICAgICAgIHJlc3VsdD0icGFzcyIg
|
194
|
+
Lz4NCiAgICAgICAgPHZhbGlkYXRpb25SZXN1bHQNCiAgICAgICAgICAgIHJ1
|
195
|
+
bGU9ImV2ZW50Q3JlYXRlZFByb3BlcnR5Ig0KICAgICAgICAgICAgcmVzdWx0
|
196
|
+
PSJwYXNzIiAvPg0KICAgICAgICA8dmFsaWRhdGlvblJlc3VsdA0KICAgICAg
|
197
|
+
ICAgICAgcnVsZT0iZXZlbnREZXNjcmlwdGlvblByb3BlcnR5Ig0KICAgICAg
|
198
|
+
ICAgICAgcmVzdWx0PSJwYXNzIiAvPg0KICAgICAgICA8dmFsaWRhdGlvblJl
|
199
|
+
c3VsdA0KICAgICAgICAgICAgcnVsZT0iZXZlbnREVEVuZER1cmF0aW9uQ29u
|
200
|
+
ZmxpY3QiDQogICAgICAgICAgICByZXN1bHQ9InBhc3MiIC8+DQogICAgICAg
|
201
|
+
IDx2YWxpZGF0aW9uUmVzdWx0DQogICAgICAgICAgICBydWxlPSJldmVudERU
|
202
|
+
RW5kUHJvcGVydHkiDQogICAgICAgICAgICByZXN1bHQ9InBhc3MiIC8+DQog
|
203
|
+
ICAgICAgIDx2YWxpZGF0aW9uUmVzdWx0DQogICAgICAgICAgICBydWxlPSJl
|
204
|
+
dmVudERUU3RhcnRQcm9wZXJ0eSINCiAgICAgICAgICAgIHJlc3VsdD0icGFz
|
205
|
+
cyIgLz4NCiAgICAgICAgPHZhbGlkYXRpb25SZXN1bHQNCiAgICAgICAgICAg
|
206
|
+
IHJ1bGU9ImV2ZW50RFRTdGFtcFByb3BlcnR5Ig0KICAgICAgICAgICAgcmVz
|
207
|
+
dWx0PSJwYXNzIiAvPg0KICAgICAgICA8dmFsaWRhdGlvblJlc3VsdA0KICAg
|
208
|
+
ICAgICAgICAgcnVsZT0iZXZlbnREdXJhdGlvblByb3BlcnR5Ig0KICAgICAg
|
209
|
+
ICAgICAgcmVzdWx0PSJwYXNzIiAvPg0KICAgICAgICA8dmFsaWRhdGlvblJl
|
210
|
+
c3VsdA0KICAgICAgICAgICAgcnVsZT0iZXZlbnRFeERhdGVQcm9wZXJ0eSIN
|
211
|
+
CiAgICAgICAgICAgIHJlc3VsdD0icGFzcyIgLz4NCiAgICAgICAgPHZhbGlk
|
212
|
+
YXRpb25SZXN1bHQNCiAgICAgICAgICAgIHJ1bGU9ImV2ZW50RXhSdWxlUHJv
|
213
|
+
cGVydHkiDQogICAgICAgICAgICByZXN1bHQ9InBhc3MiIC8+DQogICAgICAg
|
214
|
+
IDx2YWxpZGF0aW9uUmVzdWx0DQogICAgICAgICAgICBydWxlPSJldmVudEdl
|
215
|
+
b1Byb3BlcnR5Ig0KICAgICAgICAgICAgcmVzdWx0PSJwYXNzIiAvPg0KICAg
|
216
|
+
ICAgICA8dmFsaWRhdGlvblJlc3VsdA0KICAgICAgICAgICAgcnVsZT0iZXZl
|
217
|
+
bnRMYXN0TW9kUHJvcGVydHkiDQogICAgICAgICAgICByZXN1bHQ9InBhc3Mi
|
218
|
+
IC8+DQogICAgICAgIDx2YWxpZGF0aW9uUmVzdWx0DQogICAgICAgICAgICBy
|
219
|
+
dWxlPSJldmVudExvY2F0aW9uUHJvcGVydHkiDQogICAgICAgICAgICByZXN1
|
220
|
+
bHQ9InBhc3MiIC8+DQogICAgICAgIDx2YWxpZGF0aW9uUmVzdWx0DQogICAg
|
221
|
+
ICAgICAgICBydWxlPSJldmVudE9yZ2FuaXplclByb3BlcnR5Ig0KICAgICAg
|
222
|
+
ICAgICAgcmVzdWx0PSJwYXNzIiAvPg0KICAgICAgICA8dmFsaWRhdGlvblJl
|
223
|
+
c3VsdA0KICAgICAgICAgICAgcnVsZT0iZXZlbnRQcmlvcml0eVByb3BlcnR5
|
224
|
+
Ig0KICAgICAgICAgICAgcmVzdWx0PSJwYXNzIiAvPg0KICAgICAgICA8dmFs
|
225
|
+
aWRhdGlvblJlc3VsdA0KICAgICAgICAgICAgcnVsZT0iZXZlbnRSRGF0ZVBy
|
226
|
+
b3BlcnR5Ig0KICAgICAgICAgICAgcmVzdWx0PSJwYXNzIiAvPg0KICAgICAg
|
227
|
+
ICA8dmFsaWRhdGlvblJlc3VsdA0KICAgICAgICAgICAgcnVsZT0iZXZlbnRS
|
228
|
+
ZWN1cklEUHJvcGVydHkiDQogICAgICAgICAgICByZXN1bHQ9InBhc3MiIC8+
|
229
|
+
DQogICAgICAgIDx2YWxpZGF0aW9uUmVzdWx0DQogICAgICAgICAgICBydWxl
|
230
|
+
PSJldmVudFJlbGF0ZWRQcm9wZXJ0eSINCiAgICAgICAgICAgIHJlc3VsdD0i
|
231
|
+
cGFzcyIgLz4NCiAgICAgICAgPHZhbGlkYXRpb25SZXN1bHQNCiAgICAgICAg
|
232
|
+
ICAgIHJ1bGU9ImV2ZW50UmVzb3VyY2VzUHJvcGVydHkiDQogICAgICAgICAg
|
233
|
+
ICByZXN1bHQ9InBhc3MiIC8+DQogICAgICAgIDx2YWxpZGF0aW9uUmVzdWx0
|
234
|
+
DQogICAgICAgICAgICBydWxlPSJldmVudFJTdGF0dXNQcm9wZXJ0eSINCiAg
|
235
|
+
ICAgICAgICAgIHJlc3VsdD0icGFzcyIgLz4NCiAgICAgICAgPHZhbGlkYXRp
|
236
|
+
b25SZXN1bHQNCiAgICAgICAgICAgIHJ1bGU9ImV2ZW50UlJ1bGVQcm9wZXJ0
|
237
|
+
eSINCiAgICAgICAgICAgIHJlc3VsdD0icGFzcyIgLz4NCiAgICAgICAgPHZh
|
238
|
+
bGlkYXRpb25SZXN1bHQNCiAgICAgICAgICAgIHJ1bGU9ImV2ZW50U2VxUHJv
|
239
|
+
cGVydHkiDQogICAgICAgICAgICByZXN1bHQ9InBhc3MiIC8+DQogICAgICAg
|
240
|
+
IDx2YWxpZGF0aW9uUmVzdWx0DQogICAgICAgICAgICBydWxlPSJldmVudFN0
|
241
|
+
YXR1c1Byb3BlcnR5Ig0KICAgICAgICAgICAgcmVzdWx0PSJwYXNzIiAvPg0K
|
242
|
+
ICAgICAgICA8dmFsaWRhdGlvblJlc3VsdA0KICAgICAgICAgICAgcnVsZT0i
|
243
|
+
ZXZlbnRTdW1tYXJ5UHJvcGVydHkiDQogICAgICAgICAgICByZXN1bHQ9InBh
|
244
|
+
c3MiIC8+DQogICAgICAgIDx2YWxpZGF0aW9uUmVzdWx0DQogICAgICAgICAg
|
245
|
+
ICBydWxlPSJldmVudFRyYW5zcFByb3BlcnR5Ig0KICAgICAgICAgICAgcmVz
|
246
|
+
dWx0PSJwYXNzIiAvPg0KICAgICAgICA8dmFsaWRhdGlvblJlc3VsdA0KICAg
|
247
|
+
ICAgICAgICAgcnVsZT0iZXZlbnRVaWRQcm9wZXJ0eSINCiAgICAgICAgICAg
|
248
|
+
IHJlc3VsdD0icGFzcyIgLz4NCiAgICAgICAgPHZhbGlkYXRpb25SZXN1bHQN
|
249
|
+
CiAgICAgICAgICAgIHJ1bGU9ImV2ZW50VXJsUHJvcGVydHkiDQogICAgICAg
|
250
|
+
ICAgICByZXN1bHQ9InBhc3MiIC8+DQogICAgICAgIDx2YWxpZGF0aW9uUmVz
|
251
|
+
dWx0DQogICAgICAgICAgICBydWxlPSJldmVudFhQcm9wZXJ0eSINCiAgICAg
|
252
|
+
ICAgICAgIHJlc3VsdD0icGFzcyIgLz4NCiAgICA8L3ZhbGlkYXRpb25SZXN1
|
253
|
+
bHRzPg0KPC9yZXN1bHRzPg==
|
254
|
+
http_version:
|
255
|
+
recorded_at: Thu, 02 Jan 2014 06:46:51 GMT
|
256
|
+
recorded_with: VCR 2.5.0
|
@@ -29,7 +29,7 @@ http_interactions:
|
|
29
29
|
X-Powered-By:
|
30
30
|
- ASP.NET
|
31
31
|
Date:
|
32
|
-
-
|
32
|
+
- Thu, 02 Jan 2014 06:46:47 GMT
|
33
33
|
Content-Length:
|
34
34
|
- '9314'
|
35
35
|
body:
|
@@ -38,8 +38,8 @@ http_interactions:
|
|
38
38
|
77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjw/
|
39
39
|
eG1sLXN0eWxlc2hlZXQgdHlwZT0idGV4dC94c2wiIGhyZWY9InJlc3VsdHMu
|
40
40
|
eHNsdCI/Pg0KPHJlc3VsdHMNCiAgICBsYW5ndWFnZT0iZW4iDQogICAgZGF0
|
41
|
-
|
42
|
-
|
41
|
+
ZXRpbWU9IjIwMTQtMDEtMDJUMDY6NDY6NDUiDQogICAgcGVybWFsaW5rPSIv
|
42
|
+
P2lkPTYzNTI0MjQyMDA1MDM5MTkyMCIgeG1sbnM9Imh0dHA6Ly9pY2FsdmFs
|
43
43
|
aWQud2lraWRvdC5jb20vdmFsaWRhdGlvbiI+DQogICAgPHVzaW5nDQogICAg
|
44
44
|
ICAgIG5hbWU9IkREYXkuaUNhbCINCiAgICAgICAgdXJsPSJodHRwOi8vd3d3
|
45
45
|
LmRkYXlzb2Z0d2FyZS5jb20vUGFnZXMvUHJvamVjdHMvRERheS5pQ2FsLyIN
|
@@ -243,5 +243,5 @@ http_interactions:
|
|
243
243
|
cnVsZT0iZXZlbnRYUHJvcGVydHkiDQogICAgICAgICAgICByZXN1bHQ9InBh
|
244
244
|
c3MiIC8+DQogICAgPC92YWxpZGF0aW9uUmVzdWx0cz4NCjwvcmVzdWx0cz4=
|
245
245
|
http_version:
|
246
|
-
recorded_at:
|
246
|
+
recorded_at: Thu, 02 Jan 2014 06:46:47 GMT
|
247
247
|
recorded_with: VCR 2.5.0
|
@@ -0,0 +1,113 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe IcsValidator, :vcr do
|
4
|
+
|
5
|
+
describe ".valid_feed?(url)" do
|
6
|
+
|
7
|
+
context "given a valid ICS feed" do
|
8
|
+
let(:valid_ics_feed_url) {
|
9
|
+
"http://elmcity.cloudapp.net/elmcity/ics?view=art"
|
10
|
+
}
|
11
|
+
|
12
|
+
it "returns true" do
|
13
|
+
expect(
|
14
|
+
described_class.valid_feed?(valid_ics_feed_url)
|
15
|
+
).to be_true
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
context "given an invalid ICS feed" do
|
20
|
+
let(:invalid_ics_feed_url) {
|
21
|
+
"http://example.com/"
|
22
|
+
}
|
23
|
+
|
24
|
+
it "returns false" do
|
25
|
+
expect(
|
26
|
+
described_class.valid_feed?(invalid_ics_feed_url)
|
27
|
+
).to be_false
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
describe ".valid_file?(path)" do
|
34
|
+
|
35
|
+
context "given a valid ICS file" do
|
36
|
+
let(:valid_ics_file) {
|
37
|
+
File.expand_path('../fixtures/icalendar/valid.ics', __FILE__)
|
38
|
+
}
|
39
|
+
|
40
|
+
it "returns true" do
|
41
|
+
expect(
|
42
|
+
described_class.valid_file?(valid_ics_file)
|
43
|
+
).to be_true
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context "given an invalid ICS file" do
|
48
|
+
let(:invalid_ics_file) {
|
49
|
+
File.expand_path('../fixtures/icalendar/invalid.ics', __FILE__)
|
50
|
+
}
|
51
|
+
|
52
|
+
it "returns false" do
|
53
|
+
expect(
|
54
|
+
described_class.valid_file?(invalid_ics_file)
|
55
|
+
).to be_false
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
describe ".valid_snippet?(snippet)" do
|
62
|
+
|
63
|
+
context "given a valid ICS snippet" do
|
64
|
+
let(:valid_ics_snippet) {
|
65
|
+
<<-EOF
|
66
|
+
BEGIN:VCALENDAR
|
67
|
+
VERSION:2.0
|
68
|
+
CALSCALE:GREGORIAN
|
69
|
+
METHOD:PUBLISH
|
70
|
+
PRODID:iCalendar-Ruby
|
71
|
+
BEGIN:VTIMEZONE
|
72
|
+
TZID:America/New_York
|
73
|
+
BEGIN:DAYLIGHT
|
74
|
+
DTSTART:19700308T020000
|
75
|
+
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
|
76
|
+
TZNAME:EDT
|
77
|
+
TZOFFSETFROM:-0500
|
78
|
+
TZOFFSETTO:-0400
|
79
|
+
END:DAYLIGHT
|
80
|
+
BEGIN:STANDARD
|
81
|
+
DTSTART:19701101T020000
|
82
|
+
RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
|
83
|
+
TZNAME:EST
|
84
|
+
TZOFFSETFROM:-0400
|
85
|
+
TZOFFSETTO:-0500
|
86
|
+
END:STANDARD
|
87
|
+
END:VTIMEZONE
|
88
|
+
END:VCALENDAR
|
89
|
+
EOF
|
90
|
+
}
|
91
|
+
|
92
|
+
it "returns true" do
|
93
|
+
expect(
|
94
|
+
described_class.valid_snippet?(valid_ics_snippet)
|
95
|
+
).to be_true
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
context "given an invalid ICS snippet" do
|
100
|
+
let(:invalid_ics_snippet) {
|
101
|
+
"LOL. THIS ISN'T EVEN CLOSE"
|
102
|
+
}
|
103
|
+
|
104
|
+
it "returns false" do
|
105
|
+
expect(
|
106
|
+
described_class.valid_snippet?(invalid_ics_snippet)
|
107
|
+
).to be_false
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ics_validator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matt Gillooly
|
@@ -143,6 +143,7 @@ executables: []
|
|
143
143
|
extensions: []
|
144
144
|
extra_rdoc_files: []
|
145
145
|
files:
|
146
|
+
- .coveralls.yml
|
146
147
|
- .gitignore
|
147
148
|
- .rspec
|
148
149
|
- .travis.yml
|
@@ -152,17 +153,14 @@ files:
|
|
152
153
|
- Rakefile
|
153
154
|
- ics_validator.gemspec
|
154
155
|
- lib/ics_validator.rb
|
155
|
-
- lib/ics_validator/
|
156
|
-
- lib/ics_validator/file_validator.rb
|
157
|
-
- lib/ics_validator/snippet_validator.rb
|
156
|
+
- lib/ics_validator/api_response.rb
|
158
157
|
- lib/ics_validator/version.rb
|
159
|
-
-
|
160
|
-
- spec/cassettes/
|
158
|
+
- lib/ics_validator/web_session.rb
|
159
|
+
- spec/cassettes/IcsValidator/_valid_feed_url_/given_a_valid_ICS_feed/returns_true.yml
|
160
|
+
- spec/cassettes/IcsValidator/_valid_feed_url_/given_an_invalid_ICS_feed/returns_false.yml
|
161
161
|
- spec/fixtures/icalendar/invalid.ics
|
162
162
|
- spec/fixtures/icalendar/valid.ics
|
163
|
-
- spec/
|
164
|
-
- spec/ics_validator/file_validator_spec.rb
|
165
|
-
- spec/ics_validator/snippet_validator_spec.rb
|
163
|
+
- spec/ics_validator_spec.rb
|
166
164
|
- spec/spec_helper.rb
|
167
165
|
homepage: http://github.com/mattgillooly/ics_validator
|
168
166
|
licenses:
|
@@ -189,11 +187,9 @@ signing_key:
|
|
189
187
|
specification_version: 4
|
190
188
|
summary: Validate iCalendar content
|
191
189
|
test_files:
|
192
|
-
- spec/cassettes/
|
193
|
-
- spec/cassettes/
|
190
|
+
- spec/cassettes/IcsValidator/_valid_feed_url_/given_a_valid_ICS_feed/returns_true.yml
|
191
|
+
- spec/cassettes/IcsValidator/_valid_feed_url_/given_an_invalid_ICS_feed/returns_false.yml
|
194
192
|
- spec/fixtures/icalendar/invalid.ics
|
195
193
|
- spec/fixtures/icalendar/valid.ics
|
196
|
-
- spec/
|
197
|
-
- spec/ics_validator/file_validator_spec.rb
|
198
|
-
- spec/ics_validator/snippet_validator_spec.rb
|
194
|
+
- spec/ics_validator_spec.rb
|
199
195
|
- spec/spec_helper.rb
|
@@ -1,40 +0,0 @@
|
|
1
|
-
require 'nokogiri'
|
2
|
-
require 'rest-client'
|
3
|
-
|
4
|
-
module IcsValidator
|
5
|
-
|
6
|
-
# Validate an iCalendar feed by URL.
|
7
|
-
#
|
8
|
-
class FeedValidator
|
9
|
-
|
10
|
-
def initialize(feed_url)
|
11
|
-
@feed_url = feed_url
|
12
|
-
end
|
13
|
-
|
14
|
-
def valid?
|
15
|
-
if r = validation_results
|
16
|
-
results = r.children.map{|c| c.attr(:result)}
|
17
|
-
results.compact.uniq == ['pass']
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
private
|
22
|
-
|
23
|
-
def validator_url
|
24
|
-
"http://icalvalid.cloudapp.net/?uri=#{@feed_url}"
|
25
|
-
end
|
26
|
-
|
27
|
-
def validator_response
|
28
|
-
RestClient.get(validator_url)
|
29
|
-
end
|
30
|
-
|
31
|
-
def validator_response_doc
|
32
|
-
Nokogiri::XML(validator_response)
|
33
|
-
end
|
34
|
-
|
35
|
-
def validation_results
|
36
|
-
validator_response_doc.at('validationResults')
|
37
|
-
end
|
38
|
-
|
39
|
-
end
|
40
|
-
end
|
@@ -1,49 +0,0 @@
|
|
1
|
-
require 'capybara/poltergeist'
|
2
|
-
|
3
|
-
module IcsValidator
|
4
|
-
|
5
|
-
# Validate an iCalendar file.
|
6
|
-
#
|
7
|
-
class FileValidator
|
8
|
-
|
9
|
-
def initialize(path)
|
10
|
-
@path = path
|
11
|
-
end
|
12
|
-
|
13
|
-
def valid?
|
14
|
-
if r = validation_results
|
15
|
-
results = validation_results.children.map{|c| c.attr(:result)}
|
16
|
-
results.compact.uniq == ['pass']
|
17
|
-
else
|
18
|
-
raise "unexpected markup"
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
private
|
23
|
-
|
24
|
-
def validator_response
|
25
|
-
session = Capybara::Session.new(:poltergeist)
|
26
|
-
|
27
|
-
session.driver.headers = { 'User-Agent' =>
|
28
|
-
"Mozilla/5.0 (Macintosh; Intel Mac OS X)" }
|
29
|
-
|
30
|
-
session.visit('http://icalvalid.cloudapp.net/')
|
31
|
-
|
32
|
-
session.attach_file('Content_fileUpload', File.expand_path(@path))
|
33
|
-
|
34
|
-
session.click_button "Content_btnUpload"
|
35
|
-
|
36
|
-
session.html
|
37
|
-
end
|
38
|
-
|
39
|
-
def validator_response_doc
|
40
|
-
Nokogiri::XML(validator_response)
|
41
|
-
end
|
42
|
-
|
43
|
-
def validation_results
|
44
|
-
validator_response_doc.at('validationResults')
|
45
|
-
end
|
46
|
-
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
@@ -1,48 +0,0 @@
|
|
1
|
-
require 'capybara/poltergeist'
|
2
|
-
|
3
|
-
module IcsValidator
|
4
|
-
|
5
|
-
# Validate a snippet of iCalendar content.
|
6
|
-
#
|
7
|
-
class SnippetValidator
|
8
|
-
|
9
|
-
def initialize(snippet)
|
10
|
-
@snippet = snippet
|
11
|
-
end
|
12
|
-
|
13
|
-
def valid?
|
14
|
-
if r = validation_results
|
15
|
-
results = validation_results.children.map{|c| c.attr(:result)}
|
16
|
-
results.compact.uniq == ['pass']
|
17
|
-
else
|
18
|
-
raise "unexpected markup"
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
private
|
23
|
-
|
24
|
-
def validator_response
|
25
|
-
session = Capybara::Session.new(:poltergeist)
|
26
|
-
|
27
|
-
session.driver.headers = { 'User-Agent' =>
|
28
|
-
"Mozilla/5.0 (Macintosh; Intel Mac OS X)" }
|
29
|
-
|
30
|
-
session.visit('http://icalvalid.cloudapp.net/')
|
31
|
-
|
32
|
-
session.fill_in('Content_tbSnippet', with: @snippet)
|
33
|
-
|
34
|
-
session.click_button "Content_btnValidateSnippet"
|
35
|
-
|
36
|
-
session.html
|
37
|
-
end
|
38
|
-
|
39
|
-
def validator_response_doc
|
40
|
-
Nokogiri::XML(validator_response)
|
41
|
-
end
|
42
|
-
|
43
|
-
def validation_results
|
44
|
-
validator_response_doc.at('validationResults')
|
45
|
-
end
|
46
|
-
|
47
|
-
end
|
48
|
-
end
|
data/spec/cassettes/IcsValidator_FeedValidator/given_a_valid_ICS_feed/_valid_/returns_true.yml
DELETED
@@ -1,256 +0,0 @@
|
|
1
|
-
---
|
2
|
-
http_interactions:
|
3
|
-
- request:
|
4
|
-
method: get
|
5
|
-
uri: http://icalvalid.cloudapp.net/?uri=http://elmcity.cloudapp.net/elmcity/ics?view=art
|
6
|
-
body:
|
7
|
-
encoding: US-ASCII
|
8
|
-
string: ''
|
9
|
-
headers:
|
10
|
-
Accept:
|
11
|
-
- '*/*; q=0.5, application/xml'
|
12
|
-
Accept-Encoding:
|
13
|
-
- gzip, deflate
|
14
|
-
User-Agent:
|
15
|
-
- Ruby
|
16
|
-
response:
|
17
|
-
status:
|
18
|
-
code: 200
|
19
|
-
message: OK
|
20
|
-
headers:
|
21
|
-
Cache-Control:
|
22
|
-
- private
|
23
|
-
Content-Type:
|
24
|
-
- text/xml; charset=utf-8
|
25
|
-
Server:
|
26
|
-
- Microsoft-IIS/7.0
|
27
|
-
X-Aspnet-Version:
|
28
|
-
- 4.0.30319
|
29
|
-
X-Powered-By:
|
30
|
-
- ASP.NET
|
31
|
-
Date:
|
32
|
-
- Wed, 01 Jan 2014 03:14:18 GMT
|
33
|
-
Content-Length:
|
34
|
-
- '9693'
|
35
|
-
body:
|
36
|
-
encoding: ASCII-8BIT
|
37
|
-
string: !binary |-
|
38
|
-
77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjw/
|
39
|
-
eG1sLXN0eWxlc2hlZXQgdHlwZT0idGV4dC94c2wiIGhyZWY9InJlc3VsdHMu
|
40
|
-
eHNsdCI/Pg0KPHJlc3VsdHMNCiAgICBsYW5ndWFnZT0iZW4iDQogICAgZGF0
|
41
|
-
ZXRpbWU9IjIwMTQtMDEtMDFUMDM6MTQ6MTYiDQogICAgcGVybWFsaW5rPSIv
|
42
|
-
P2lkPTYzNTI0MTQyODU2NDY1NDAwNyIgeG1sbnM9Imh0dHA6Ly9pY2FsdmFs
|
43
|
-
aWQud2lraWRvdC5jb20vdmFsaWRhdGlvbiI+DQogICAgPHVzaW5nDQogICAg
|
44
|
-
ICAgIG5hbWU9IkREYXkuaUNhbCINCiAgICAgICAgdXJsPSJodHRwOi8vd3d3
|
45
|
-
LmRkYXlzb2Z0d2FyZS5jb20vUGFnZXMvUHJvamVjdHMvRERheS5pQ2FsLyIN
|
46
|
-
CiAgICAgICAgdmVyc2lvbj0iMS4wLjEuMCIgLz4NCiAgICA8dXNpbmcNCiAg
|
47
|
-
ICAgICAgbmFtZT0iaWNhbHZhbGlkIg0KICAgICAgICB1cmw9Imh0dHA6Ly9p
|
48
|
-
Y2FsdmFsaWQuY2xvdWRhcHAubmV0Ig0KICAgICAgICB2ZXJzaW9uPSIxLjAu
|
49
|
-
MC4zIiAvPg0KICAgIDxjYWxlbmRhckxpbmVzDQogICAgICAgIHBhdGg9Imh0
|
50
|
-
dHA6Ly9lbG1jaXR5LmNsb3VkYXBwLm5ldC9lbG1jaXR5L2ljcz92aWV3PWFy
|
51
|
-
dCINCiAgICAgICAgYnl0ZUNvdW50PSIxOTYwIg0KICAgICAgICBsaW1pdD0i
|
52
|
-
NTAwIj4NCiAgICAgICAgPGxpbmUNCiAgICAgICAgICAgIG49IjEiPkJFR0lO
|
53
|
-
OlZDQUxFTkRBUjwvbGluZT4NCiAgICAgICAgPGxpbmUNCiAgICAgICAgICAg
|
54
|
-
IG49IjIiPlZFUlNJT046Mi4wPC9saW5lPg0KICAgICAgICA8bGluZQ0KICAg
|
55
|
-
ICAgICAgICAgbj0iMyI+UFJPRElEOi0vL2RkYXlzb2Z0d2FyZS5jb20vL05P
|
56
|
-
TlNHTUwgRERheS5pQ2FsIDEuMC8vRU48L2xpbmU+DQogICAgICAgIDxsaW5l
|
57
|
-
DQogICAgICAgICAgICBuPSI0Ij5CRUdJTjpWVElNRVpPTkU8L2xpbmU+DQog
|
58
|
-
ICAgICAgIDxsaW5lDQogICAgICAgICAgICBuPSI1Ij5UWklEOkVhc3Rlcm4g
|
59
|
-
U3RhbmRhcmQgVGltZTwvbGluZT4NCiAgICAgICAgPGxpbmUNCiAgICAgICAg
|
60
|
-
ICAgIG49IjYiPkJFR0lOOlNUQU5EQVJEPC9saW5lPg0KICAgICAgICA8bGlu
|
61
|
-
ZQ0KICAgICAgICAgICAgbj0iNyI+RFRTVEFSVDoyMDEzMTEwMlQwMjAwMDA8
|
62
|
-
L2xpbmU+DQogICAgICAgIDxsaW5lDQogICAgICAgICAgICBuPSI4Ij5SUlVM
|
63
|
-
RTpGUkVRPVlFQVJMWTtCWURBWT0xU1U7QllIT1VSPTI7QllNSU5VVEU9MDtC
|
64
|
-
WU1PTlRIPTExPC9saW5lPg0KICAgICAgICA8bGluZQ0KICAgICAgICAgICAg
|
65
|
-
bj0iOSI+VFpOQU1FOkVhc3Rlcm4gU3RhbmRhcmQgVGltZTwvbGluZT4NCiAg
|
66
|
-
ICAgICAgPGxpbmUNCiAgICAgICAgICAgIG49IjEwIj5UWk9GRlNFVEZST006
|
67
|
-
LTA0MDA8L2xpbmU+DQogICAgICAgIDxsaW5lDQogICAgICAgICAgICBuPSIx
|
68
|
-
MSI+VFpPRkZTRVRUTzotMDUwMDwvbGluZT4NCiAgICAgICAgPGxpbmUNCiAg
|
69
|
-
ICAgICAgICAgIG49IjEyIj5FTkQ6U1RBTkRBUkQ8L2xpbmU+DQogICAgICAg
|
70
|
-
IDxsaW5lDQogICAgICAgICAgICBuPSIxMyI+QkVHSU46REFZTElHSFQ8L2xp
|
71
|
-
bmU+DQogICAgICAgIDxsaW5lDQogICAgICAgICAgICBuPSIxNCI+RFRTVEFS
|
72
|
-
VDoyMDEzMDMwMVQwMjAwMDA8L2xpbmU+DQogICAgICAgIDxsaW5lDQogICAg
|
73
|
-
ICAgICAgICBuPSIxNSI+UlJVTEU6RlJFUT1ZRUFSTFk7QllEQVk9MlNVO0JZ
|
74
|
-
SE9VUj0yO0JZTUlOVVRFPTA7QllNT05USD0zPC9saW5lPg0KICAgICAgICA8
|
75
|
-
bGluZQ0KICAgICAgICAgICAgbj0iMTYiPlRaTkFNRTpFYXN0ZXJuIERheWxp
|
76
|
-
Z2h0IFRpbWU8L2xpbmU+DQogICAgICAgIDxsaW5lDQogICAgICAgICAgICBu
|
77
|
-
PSIxNyI+VFpPRkZTRVRGUk9NOi0wNTAwPC9saW5lPg0KICAgICAgICA8bGlu
|
78
|
-
ZQ0KICAgICAgICAgICAgbj0iMTgiPlRaT0ZGU0VUVE86LTA0MDA8L2xpbmU+
|
79
|
-
DQogICAgICAgIDxsaW5lDQogICAgICAgICAgICBuPSIxOSI+RU5EOkRBWUxJ
|
80
|
-
R0hUPC9saW5lPg0KICAgICAgICA8bGluZQ0KICAgICAgICAgICAgbj0iMjAi
|
81
|
-
PkVORDpWVElNRVpPTkU8L2xpbmU+DQogICAgICAgIDxsaW5lDQogICAgICAg
|
82
|
-
ICAgICBuPSIyMSI+QkVHSU46VkVWRU5UPC9saW5lPg0KICAgICAgICA8bGlu
|
83
|
-
ZQ0KICAgICAgICAgICAgbj0iMjIiPkNBVEVHT1JJRVM6YXJ0PC9saW5lPg0K
|
84
|
-
ICAgICAgICA8bGluZQ0KICAgICAgICAgICAgbj0iMjMiPkNBVEVHT1JJRVM6
|
85
|
-
a3NjPC9saW5lPg0KICAgICAgICA8bGluZQ0KICAgICAgICAgICAgbj0iMjQi
|
86
|
-
PkNBVEVHT1JJRVM6dW5pdmVyc2l0eTwvbGluZT4NCiAgICAgICAgPGxpbmUN
|
87
|
-
CiAgICAgICAgICAgIG49IjI1Ij5ERVNDUklQVElPTjoyMDEzw6LigqzigJwx
|
88
|
-
NCBSZWRmZXJuIENob3Jlb2dyYXBoZXItaW4tUmVzaWRlbmNlIFJlYmVjY2Eg
|
89
|
-
U3Rlbm4gaGFzIHBlPC9saW5lPg0KICAgICAgICA8bGluZQ0KICAgICAgICAg
|
90
|
-
ICAgbj0iMjYiPiByZm9ybWVkIGFuZCB0b3VyZWQgdGhyb3VnaG91dCB0aGUg
|
91
|
-
d29ybGQgYXMgYSBwcmluY2lwYWwgZGFuY2VyIHdpdGggTW9taXggYTwvbGlu
|
92
|
-
ZT4NCiAgICAgICAgPGxpbmUNCiAgICAgICAgICAgIG49IjI3Ij4gbmQgUGls
|
93
|
-
b2JvbHVzLiBTdGVubiBjcmVhdGVzIGRpc3RpbmN0aXZlIGRhbmNlIHBpZWNl
|
94
|
-
cyBhbmQgc29sbyB3b3JrcyB0aGF0IGM8L2xpbmU+DQogICAgICAgIDxsaW5l
|
95
|
-
DQogICAgICAgICAgICBuPSIyOCI+IGhhbGxlbmdlIHRoZSB1bmlxdWUgd2F5
|
96
|
-
cyB0aGF0IGxpdmUgbXVzaWMgYW5kIGRhbmNlXG5jb21tdW5pY2F0ZSBhbmQg
|
97
|
-
aW50ZXJhPC9saW5lPg0KICAgICAgICA8bGluZQ0KICAgICAgICAgICAgbj0i
|
98
|
-
MjkiPiBjdC48L2xpbmU+DQogICAgICAgIDxsaW5lDQogICAgICAgICAgICBu
|
99
|
-
PSIzMCI+RFRFTkQ7VFpJRD1FYXN0ZXJuIFN0YW5kYXJkIFRpbWU6MjAxNDAx
|
100
|
-
MjdUMjEzMDAwPC9saW5lPg0KICAgICAgICA8bGluZQ0KICAgICAgICAgICAg
|
101
|
-
bj0iMzEiPkRUU1RBTVA6MjAxNDAxMDFUMDMxNDE2WjwvbGluZT4NCiAgICAg
|
102
|
-
ICAgPGxpbmUNCiAgICAgICAgICAgIG49IjMyIj5EVFNUQVJUO1RaSUQ9RWFz
|
103
|
-
dGVybiBTdGFuZGFyZCBUaW1lOjIwMTQwMTI3VDE5MzAwMDwvbGluZT4NCiAg
|
104
|
-
ICAgICAgPGxpbmUNCiAgICAgICAgICAgIG49IjMzIj5MT0NBVElPTjo8L2xp
|
105
|
-
bmU+DQogICAgICAgIDxsaW5lDQogICAgICAgICAgICBuPSIzNCI+U0VRVUVO
|
106
|
-
Q0U6MDwvbGluZT4NCiAgICAgICAgPGxpbmUNCiAgICAgICAgICAgIG49IjM1
|
107
|
-
Ij5TVU1NQVJZOlJlYmVjY2EgU3Rlbm4gTW9kZXJuIERhbmNlPC9saW5lPg0K
|
108
|
-
ICAgICAgICA8bGluZQ0KICAgICAgICAgICAgbj0iMzYiPlVJRDo4ZTQwNWJm
|
109
|
-
Yi0yY2RkLTQ0MzMtOTE4Ni1kOGIwODg0NTY0NDM8L2xpbmU+DQogICAgICAg
|
110
|
-
IDxsaW5lDQogICAgICAgICAgICBuPSIzNyI+VVJMOmh0dHA6Ly93d3cua2Vl
|
111
|
-
bmUuZWR1L25ld3MvZXZlbnRzL2RldGFpbC8xMjMyLzwvbGluZT4NCiAgICAg
|
112
|
-
ICAgPGxpbmUNCiAgICAgICAgICAgIG49IjM4Ij5FTkQ6VkVWRU5UPC9saW5l
|
113
|
-
Pg0KICAgICAgICA8bGluZQ0KICAgICAgICAgICAgbj0iMzkiPkJFR0lOOlZF
|
114
|
-
VkVOVDwvbGluZT4NCiAgICAgICAgPGxpbmUNCiAgICAgICAgICAgIG49IjQw
|
115
|
-
Ij5DQVRFR09SSUVTOmFydDwvbGluZT4NCiAgICAgICAgPGxpbmUNCiAgICAg
|
116
|
-
ICAgICAgIG49IjQxIj5DQVRFR09SSUVTOmtzYzwvbGluZT4NCiAgICAgICAg
|
117
|
-
PGxpbmUNCiAgICAgICAgICAgIG49IjQyIj5DQVRFR09SSUVTOnRoZWF0ZXI8
|
118
|
-
L2xpbmU+DQogICAgICAgIDxsaW5lDQogICAgICAgICAgICBuPSI0MyI+Q0FU
|
119
|
-
RUdPUklFUzp1bml2ZXJzaXR5PC9saW5lPg0KICAgICAgICA8bGluZQ0KICAg
|
120
|
-
ICAgICAgICAgbj0iNDQiPkRFU0NSSVBUSU9OOkluIHRoZWlyIHByZW1pZXJl
|
121
|
-
IEFtZXJpY2FuIHRvdXJcLCB0aGlzIGhpbGFyaW91cyBjaXJjdXNcbnRyb3Vw
|
122
|
-
ZTwvbGluZT4NCiAgICAgICAgPGxpbmUNCiAgICAgICAgICAgIG49IjQ1Ij4g
|
123
|
-
IGZlYXR1cmVzIGxvZy13YWxraW5nXCwgc3Bvb24tY2xhY2tpbmdcLCBoYXRj
|
124
|
-
aGV0LWp1Z2dsaW5nXCwgY2xvZy1kYW5jaW5nXCw8L2xpbmU+DQogICAgICAg
|
125
|
-
IDxsaW5lDQogICAgICAgICAgICBuPSI0NiI+ICBhbmQgZXZlbiBoaWppbmtz
|
126
|
-
IG9uIGFuIG91dGhvdXNlISBBIHNtb3JnYXNib3JkIG9mIGZhbWlseSBmdW4g
|
127
|
-
YmFzZWQgb24gdGhlPC9saW5lPg0KICAgICAgICA8bGluZQ0KICAgICAgICAg
|
128
|
-
ICAgbj0iNDciPiAgbG9nZ2luZyB0cmFkaXRpb24gd2l0aCB0cm91cGVycyBw
|
129
|
-
ZXJmb3JtaW5nIGRhcmluZyBrbmlmZSB0cmlja3MgYW5kIGFjcm9iYTwvbGlu
|
130
|
-
ZT4NCiAgICAgICAgPGxpbmUNCiAgICAgICAgICAgIG49IjQ4Ij4gdGljIGZl
|
131
|
-
YXRzIHRvIHRoZSB0b2UtdGFwcGluZyBzb3VuZHMgb2YgUXVlYmVjb2lzIGZv
|
132
|
-
bGsgbXVzaWMuPC9saW5lPg0KICAgICAgICA8bGluZQ0KICAgICAgICAgICAg
|
133
|
-
bj0iNDkiPkRURU5EO1RaSUQ9RWFzdGVybiBTdGFuZGFyZCBUaW1lOjIwMTQw
|
134
|
-
MjAxVDE2MDAwMDwvbGluZT4NCiAgICAgICAgPGxpbmUNCiAgICAgICAgICAg
|
135
|
-
IG49IjUwIj5EVFNUQU1QOjIwMTQwMTAxVDAzMTQxNlo8L2xpbmU+DQogICAg
|
136
|
-
ICAgIDxsaW5lDQogICAgICAgICAgICBuPSI1MSI+RFRTVEFSVDtUWklEPUVh
|
137
|
-
c3Rlcm4gU3RhbmRhcmQgVGltZToyMDE0MDIwMVQxNDAwMDA8L2xpbmU+DQog
|
138
|
-
ICAgICAgIDxsaW5lDQogICAgICAgICAgICBuPSI1MiI+TE9DQVRJT046PC9s
|
139
|
-
aW5lPg0KICAgICAgICA8bGluZQ0KICAgICAgICAgICAgbj0iNTMiPlNFUVVF
|
140
|
-
TkNFOjA8L2xpbmU+DQogICAgICAgIDxsaW5lDQogICAgICAgICAgICBuPSI1
|
141
|
-
NCI+U1VNTUFSWTpDaXJxdWUgQWxmb25zZSBpbiAiVGltYmVyISI8L2xpbmU+
|
142
|
-
DQogICAgICAgIDxsaW5lDQogICAgICAgICAgICBuPSI1NSI+VUlEOjUyOGMx
|
143
|
-
MzhlLWYwMGYtNDgxYi05N2JjLTc0N2FlMTdjMDI4MjwvbGluZT4NCiAgICAg
|
144
|
-
ICAgPGxpbmUNCiAgICAgICAgICAgIG49IjU2Ij5VUkw6aHR0cDovL3d3dy5r
|
145
|
-
ZWVuZS5lZHUvbmV3cy9ldmVudHMvZGV0YWlsLzEyMzMvPC9saW5lPg0KICAg
|
146
|
-
ICAgICA8bGluZQ0KICAgICAgICAgICAgbj0iNTciPkVORDpWRVZFTlQ8L2xp
|
147
|
-
bmU+DQogICAgICAgIDxsaW5lDQogICAgICAgICAgICBuPSI1OCI+RU5EOlZD
|
148
|
-
QUxFTkRBUjwvbGluZT4NCiAgICA8L2NhbGVuZGFyTGluZXM+DQogICAgPHZh
|
149
|
-
bGlkYXRpb25SZXN1bHRzDQogICAgICAgIHJ1bGVzZXQ9IlN0cmljdF8yXzAi
|
150
|
-
DQogICAgICAgIHJ1bGVzZXRTdHJpbmc9ImlDYWxlbmRhciAyLjAgU3RyaWN0
|
151
|
-
Ig0KICAgICAgICBydWxlc2V0RGVzY3JpcHRpb249IiYjeEQ7JiN4QTsgICAg
|
152
|
-
ICAgIFZhbGlkYXRlcyBpQ2FsZW5kYXJzIGFnYWluc3QgdGhlIElFVEYgc3Rh
|
153
|
-
bmRhcmRzIGluIGEgc3RyaWN0IGZhc2hpb24uICBBbnkgdmFyaWF0aW9ucyBm
|
154
|
-
cm9tIHRoZSBzdGFuZGFyZCYjeEQ7JiN4QTsgICAgICAgIHdpbGwgYmUgcmVw
|
155
|
-
b3J0ZWQuJiN4RDsmI3hBOyAgICAiDQogICAgICAgIHNjb3JlPSIxMDAiPg0K
|
156
|
-
ICAgICAgICA8Y2FsZW5kYXJJbmZvcz4NCiAgICAgICAgICAgIDxjYWxlbmRh
|
157
|
-
ckluZm8NCiAgICAgICAgICAgICAgICB0aW1lWm9uZUNvdW50PSIxIg0KICAg
|
158
|
-
ICAgICAgICAgICAgIGV2ZW50Q291bnQ9IjIiDQogICAgICAgICAgICAgICAg
|
159
|
-
dG9kb0NvdW50PSIwIg0KICAgICAgICAgICAgICAgIGpvdXJuYWxDb3VudD0i
|
160
|
-
MCINCiAgICAgICAgICAgICAgICBmcmVlQnVzeUNvdW50PSIwIg0KICAgICAg
|
161
|
-
ICAgICAgICAgIGNhbGVuZGFyVmVyc2lvbj0iMi4wIg0KICAgICAgICAgICAg
|
162
|
-
ICAgIHByb2RJRD0iLS8vZGRheXNvZnR3YXJlLmNvbS8vTk9OU0dNTCBERGF5
|
163
|
-
LmlDYWwgMS4wLy9FTiIgLz4NCiAgICAgICAgPC9jYWxlbmRhckluZm9zPg0K
|
164
|
-
ICAgICAgICA8dmFsaWRhdGlvblJlc3VsdA0KICAgICAgICAgICAgcnVsZT0i
|
165
|
-
ZW1wdHlMaW5lIg0KICAgICAgICAgICAgcmVzdWx0PSJwYXNzIiAvPg0KICAg
|
166
|
-
ICAgICA8dmFsaWRhdGlvblJlc3VsdA0KICAgICAgICAgICAgcnVsZT0iY3Js
|
167
|
-
ZlBhaXJzIg0KICAgICAgICAgICAgcmVzdWx0PSJwYXNzIiAvPg0KICAgICAg
|
168
|
-
ICA8dmFsaWRhdGlvblJlc3VsdA0KICAgICAgICAgICAgcnVsZT0ibGluZUZv
|
169
|
-
bGRpbmciDQogICAgICAgICAgICByZXN1bHQ9InBhc3MiIC8+DQogICAgICAg
|
170
|
-
IDx2YWxpZGF0aW9uUmVzdWx0DQogICAgICAgICAgICBydWxlPSJ2ZXJzaW9u
|
171
|
-
Ig0KICAgICAgICAgICAgcmVzdWx0PSJwYXNzIiAvPg0KICAgICAgICA8dmFs
|
172
|
-
aWRhdGlvblJlc3VsdA0KICAgICAgICAgICAgcnVsZT0icHJvZElEIg0KICAg
|
173
|
-
ICAgICAgICAgcmVzdWx0PSJwYXNzIiAvPg0KICAgICAgICA8dmFsaWRhdGlv
|
174
|
-
blJlc3VsdA0KICAgICAgICAgICAgcnVsZT0iY2FsU2NhbGUiDQogICAgICAg
|
175
|
-
ICAgICByZXN1bHQ9InBhc3MiIC8+DQogICAgICAgIDx2YWxpZGF0aW9uUmVz
|
176
|
-
dWx0DQogICAgICAgICAgICBydWxlPSJtZXRob2QiDQogICAgICAgICAgICBy
|
177
|
-
ZXN1bHQ9InBhc3MiIC8+DQogICAgICAgIDx2YWxpZGF0aW9uUmVzdWx0DQog
|
178
|
-
ICAgICAgICAgICBydWxlPSJjb21wb25lbnQiDQogICAgICAgICAgICByZXN1
|
179
|
-
bHQ9InBhc3MiIC8+DQogICAgICAgIDx2YWxpZGF0aW9uUmVzdWx0DQogICAg
|
180
|
-
ICAgICAgICBydWxlPSIiDQogICAgICAgICAgICByZXN1bHQ9InBhc3MiIC8+
|
181
|
-
DQogICAgICAgIDx2YWxpZGF0aW9uUmVzdWx0DQogICAgICAgICAgICBydWxl
|
182
|
-
PSJldmVudEF0dGFjaFByb3BlcnR5Ig0KICAgICAgICAgICAgcmVzdWx0PSJw
|
183
|
-
YXNzIiAvPg0KICAgICAgICA8dmFsaWRhdGlvblJlc3VsdA0KICAgICAgICAg
|
184
|
-
ICAgcnVsZT0iZXZlbnRBdHRlbmRlZVByb3BlcnR5Ig0KICAgICAgICAgICAg
|
185
|
-
cmVzdWx0PSJwYXNzIiAvPg0KICAgICAgICA8dmFsaWRhdGlvblJlc3VsdA0K
|
186
|
-
ICAgICAgICAgICAgcnVsZT0iZXZlbnRDYXRlZ29yaWVzUHJvcGVydHkiDQog
|
187
|
-
ICAgICAgICAgICByZXN1bHQ9InBhc3MiIC8+DQogICAgICAgIDx2YWxpZGF0
|
188
|
-
aW9uUmVzdWx0DQogICAgICAgICAgICBydWxlPSJldmVudENsYXNzUHJvcGVy
|
189
|
-
dHkiDQogICAgICAgICAgICByZXN1bHQ9InBhc3MiIC8+DQogICAgICAgIDx2
|
190
|
-
YWxpZGF0aW9uUmVzdWx0DQogICAgICAgICAgICBydWxlPSJldmVudENvbW1l
|
191
|
-
bnRQcm9wZXJ0eSINCiAgICAgICAgICAgIHJlc3VsdD0icGFzcyIgLz4NCiAg
|
192
|
-
ICAgICAgPHZhbGlkYXRpb25SZXN1bHQNCiAgICAgICAgICAgIHJ1bGU9ImV2
|
193
|
-
ZW50Q29udGFjdFByb3BlcnR5Ig0KICAgICAgICAgICAgcmVzdWx0PSJwYXNz
|
194
|
-
IiAvPg0KICAgICAgICA8dmFsaWRhdGlvblJlc3VsdA0KICAgICAgICAgICAg
|
195
|
-
cnVsZT0iZXZlbnRDcmVhdGVkUHJvcGVydHkiDQogICAgICAgICAgICByZXN1
|
196
|
-
bHQ9InBhc3MiIC8+DQogICAgICAgIDx2YWxpZGF0aW9uUmVzdWx0DQogICAg
|
197
|
-
ICAgICAgICBydWxlPSJldmVudERlc2NyaXB0aW9uUHJvcGVydHkiDQogICAg
|
198
|
-
ICAgICAgICByZXN1bHQ9InBhc3MiIC8+DQogICAgICAgIDx2YWxpZGF0aW9u
|
199
|
-
UmVzdWx0DQogICAgICAgICAgICBydWxlPSJldmVudERURW5kRHVyYXRpb25D
|
200
|
-
b25mbGljdCINCiAgICAgICAgICAgIHJlc3VsdD0icGFzcyIgLz4NCiAgICAg
|
201
|
-
ICAgPHZhbGlkYXRpb25SZXN1bHQNCiAgICAgICAgICAgIHJ1bGU9ImV2ZW50
|
202
|
-
RFRFbmRQcm9wZXJ0eSINCiAgICAgICAgICAgIHJlc3VsdD0icGFzcyIgLz4N
|
203
|
-
CiAgICAgICAgPHZhbGlkYXRpb25SZXN1bHQNCiAgICAgICAgICAgIHJ1bGU9
|
204
|
-
ImV2ZW50RFRTdGFydFByb3BlcnR5Ig0KICAgICAgICAgICAgcmVzdWx0PSJw
|
205
|
-
YXNzIiAvPg0KICAgICAgICA8dmFsaWRhdGlvblJlc3VsdA0KICAgICAgICAg
|
206
|
-
ICAgcnVsZT0iZXZlbnREVFN0YW1wUHJvcGVydHkiDQogICAgICAgICAgICBy
|
207
|
-
ZXN1bHQ9InBhc3MiIC8+DQogICAgICAgIDx2YWxpZGF0aW9uUmVzdWx0DQog
|
208
|
-
ICAgICAgICAgICBydWxlPSJldmVudER1cmF0aW9uUHJvcGVydHkiDQogICAg
|
209
|
-
ICAgICAgICByZXN1bHQ9InBhc3MiIC8+DQogICAgICAgIDx2YWxpZGF0aW9u
|
210
|
-
UmVzdWx0DQogICAgICAgICAgICBydWxlPSJldmVudEV4RGF0ZVByb3BlcnR5
|
211
|
-
Ig0KICAgICAgICAgICAgcmVzdWx0PSJwYXNzIiAvPg0KICAgICAgICA8dmFs
|
212
|
-
aWRhdGlvblJlc3VsdA0KICAgICAgICAgICAgcnVsZT0iZXZlbnRFeFJ1bGVQ
|
213
|
-
cm9wZXJ0eSINCiAgICAgICAgICAgIHJlc3VsdD0icGFzcyIgLz4NCiAgICAg
|
214
|
-
ICAgPHZhbGlkYXRpb25SZXN1bHQNCiAgICAgICAgICAgIHJ1bGU9ImV2ZW50
|
215
|
-
R2VvUHJvcGVydHkiDQogICAgICAgICAgICByZXN1bHQ9InBhc3MiIC8+DQog
|
216
|
-
ICAgICAgIDx2YWxpZGF0aW9uUmVzdWx0DQogICAgICAgICAgICBydWxlPSJl
|
217
|
-
dmVudExhc3RNb2RQcm9wZXJ0eSINCiAgICAgICAgICAgIHJlc3VsdD0icGFz
|
218
|
-
cyIgLz4NCiAgICAgICAgPHZhbGlkYXRpb25SZXN1bHQNCiAgICAgICAgICAg
|
219
|
-
IHJ1bGU9ImV2ZW50TG9jYXRpb25Qcm9wZXJ0eSINCiAgICAgICAgICAgIHJl
|
220
|
-
c3VsdD0icGFzcyIgLz4NCiAgICAgICAgPHZhbGlkYXRpb25SZXN1bHQNCiAg
|
221
|
-
ICAgICAgICAgIHJ1bGU9ImV2ZW50T3JnYW5pemVyUHJvcGVydHkiDQogICAg
|
222
|
-
ICAgICAgICByZXN1bHQ9InBhc3MiIC8+DQogICAgICAgIDx2YWxpZGF0aW9u
|
223
|
-
UmVzdWx0DQogICAgICAgICAgICBydWxlPSJldmVudFByaW9yaXR5UHJvcGVy
|
224
|
-
dHkiDQogICAgICAgICAgICByZXN1bHQ9InBhc3MiIC8+DQogICAgICAgIDx2
|
225
|
-
YWxpZGF0aW9uUmVzdWx0DQogICAgICAgICAgICBydWxlPSJldmVudFJEYXRl
|
226
|
-
UHJvcGVydHkiDQogICAgICAgICAgICByZXN1bHQ9InBhc3MiIC8+DQogICAg
|
227
|
-
ICAgIDx2YWxpZGF0aW9uUmVzdWx0DQogICAgICAgICAgICBydWxlPSJldmVu
|
228
|
-
dFJlY3VySURQcm9wZXJ0eSINCiAgICAgICAgICAgIHJlc3VsdD0icGFzcyIg
|
229
|
-
Lz4NCiAgICAgICAgPHZhbGlkYXRpb25SZXN1bHQNCiAgICAgICAgICAgIHJ1
|
230
|
-
bGU9ImV2ZW50UmVsYXRlZFByb3BlcnR5Ig0KICAgICAgICAgICAgcmVzdWx0
|
231
|
-
PSJwYXNzIiAvPg0KICAgICAgICA8dmFsaWRhdGlvblJlc3VsdA0KICAgICAg
|
232
|
-
ICAgICAgcnVsZT0iZXZlbnRSZXNvdXJjZXNQcm9wZXJ0eSINCiAgICAgICAg
|
233
|
-
ICAgIHJlc3VsdD0icGFzcyIgLz4NCiAgICAgICAgPHZhbGlkYXRpb25SZXN1
|
234
|
-
bHQNCiAgICAgICAgICAgIHJ1bGU9ImV2ZW50UlN0YXR1c1Byb3BlcnR5Ig0K
|
235
|
-
ICAgICAgICAgICAgcmVzdWx0PSJwYXNzIiAvPg0KICAgICAgICA8dmFsaWRh
|
236
|
-
dGlvblJlc3VsdA0KICAgICAgICAgICAgcnVsZT0iZXZlbnRSUnVsZVByb3Bl
|
237
|
-
cnR5Ig0KICAgICAgICAgICAgcmVzdWx0PSJwYXNzIiAvPg0KICAgICAgICA8
|
238
|
-
dmFsaWRhdGlvblJlc3VsdA0KICAgICAgICAgICAgcnVsZT0iZXZlbnRTZXFQ
|
239
|
-
cm9wZXJ0eSINCiAgICAgICAgICAgIHJlc3VsdD0icGFzcyIgLz4NCiAgICAg
|
240
|
-
ICAgPHZhbGlkYXRpb25SZXN1bHQNCiAgICAgICAgICAgIHJ1bGU9ImV2ZW50
|
241
|
-
U3RhdHVzUHJvcGVydHkiDQogICAgICAgICAgICByZXN1bHQ9InBhc3MiIC8+
|
242
|
-
DQogICAgICAgIDx2YWxpZGF0aW9uUmVzdWx0DQogICAgICAgICAgICBydWxl
|
243
|
-
PSJldmVudFN1bW1hcnlQcm9wZXJ0eSINCiAgICAgICAgICAgIHJlc3VsdD0i
|
244
|
-
cGFzcyIgLz4NCiAgICAgICAgPHZhbGlkYXRpb25SZXN1bHQNCiAgICAgICAg
|
245
|
-
ICAgIHJ1bGU9ImV2ZW50VHJhbnNwUHJvcGVydHkiDQogICAgICAgICAgICBy
|
246
|
-
ZXN1bHQ9InBhc3MiIC8+DQogICAgICAgIDx2YWxpZGF0aW9uUmVzdWx0DQog
|
247
|
-
ICAgICAgICAgICBydWxlPSJldmVudFVpZFByb3BlcnR5Ig0KICAgICAgICAg
|
248
|
-
ICAgcmVzdWx0PSJwYXNzIiAvPg0KICAgICAgICA8dmFsaWRhdGlvblJlc3Vs
|
249
|
-
dA0KICAgICAgICAgICAgcnVsZT0iZXZlbnRVcmxQcm9wZXJ0eSINCiAgICAg
|
250
|
-
ICAgICAgIHJlc3VsdD0icGFzcyIgLz4NCiAgICAgICAgPHZhbGlkYXRpb25S
|
251
|
-
ZXN1bHQNCiAgICAgICAgICAgIHJ1bGU9ImV2ZW50WFByb3BlcnR5Ig0KICAg
|
252
|
-
ICAgICAgICAgcmVzdWx0PSJwYXNzIiAvPg0KICAgIDwvdmFsaWRhdGlvblJl
|
253
|
-
c3VsdHM+DQo8L3Jlc3VsdHM+
|
254
|
-
http_version:
|
255
|
-
recorded_at: Wed, 01 Jan 2014 03:14:18 GMT
|
256
|
-
recorded_with: VCR 2.5.0
|
@@ -1,33 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe IcsValidator::FeedValidator, :vcr do
|
4
|
-
|
5
|
-
context "given a valid ICS feed" do
|
6
|
-
let(:valid_ics_feed_url) {
|
7
|
-
"http://elmcity.cloudapp.net/elmcity/ics?view=art"
|
8
|
-
}
|
9
|
-
|
10
|
-
subject { described_class.new(valid_ics_feed_url) }
|
11
|
-
|
12
|
-
describe "#valid?" do
|
13
|
-
it "returns true" do
|
14
|
-
subject.should be_valid
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
context "given an invalid ICS feed" do
|
20
|
-
let(:invalid_ics_feed_url) {
|
21
|
-
"http://example.com/"
|
22
|
-
}
|
23
|
-
|
24
|
-
subject { described_class.new(invalid_ics_feed_url) }
|
25
|
-
|
26
|
-
describe "#valid?" do
|
27
|
-
it "returns false" do
|
28
|
-
subject.should_not be_valid
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
end
|
@@ -1,33 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe IcsValidator::FileValidator, :vcr do
|
4
|
-
|
5
|
-
context "given a valid ICS file" do
|
6
|
-
let(:valid_ics_file) {
|
7
|
-
File.expand_path('../../fixtures/icalendar/valid.ics', __FILE__)
|
8
|
-
}
|
9
|
-
|
10
|
-
subject { described_class.new(valid_ics_file) }
|
11
|
-
|
12
|
-
describe "#valid?" do
|
13
|
-
it "returns true" do
|
14
|
-
subject.should be_valid
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
context "given an invalid ICS file" do
|
20
|
-
let(:invalid_ics_file) {
|
21
|
-
File.expand_path('../../fixtures/icalendar/invalid.ics', __FILE__)
|
22
|
-
}
|
23
|
-
|
24
|
-
subject { described_class.new(invalid_ics_file) }
|
25
|
-
|
26
|
-
describe "#valid?" do
|
27
|
-
it "returns false" do
|
28
|
-
subject.should_not be_valid
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
end
|
@@ -1,57 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe IcsValidator::SnippetValidator, :vcr do
|
4
|
-
|
5
|
-
context "given a valid ICS snippet" do
|
6
|
-
let(:valid_ics_snippet) {
|
7
|
-
<<-EOF
|
8
|
-
BEGIN:VCALENDAR
|
9
|
-
VERSION:2.0
|
10
|
-
CALSCALE:GREGORIAN
|
11
|
-
METHOD:PUBLISH
|
12
|
-
PRODID:iCalendar-Ruby
|
13
|
-
BEGIN:VTIMEZONE
|
14
|
-
TZID:America/New_York
|
15
|
-
BEGIN:DAYLIGHT
|
16
|
-
DTSTART:19700308T020000
|
17
|
-
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
|
18
|
-
TZNAME:EDT
|
19
|
-
TZOFFSETFROM:-0500
|
20
|
-
TZOFFSETTO:-0400
|
21
|
-
END:DAYLIGHT
|
22
|
-
BEGIN:STANDARD
|
23
|
-
DTSTART:19701101T020000
|
24
|
-
RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
|
25
|
-
TZNAME:EST
|
26
|
-
TZOFFSETFROM:-0400
|
27
|
-
TZOFFSETTO:-0500
|
28
|
-
END:STANDARD
|
29
|
-
END:VTIMEZONE
|
30
|
-
END:VCALENDAR
|
31
|
-
EOF
|
32
|
-
}
|
33
|
-
|
34
|
-
subject { described_class.new(valid_ics_snippet) }
|
35
|
-
|
36
|
-
describe "#valid?" do
|
37
|
-
it "returns true" do
|
38
|
-
subject.should be_valid
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
context "given an invalid ICS snippet" do
|
44
|
-
let(:invalid_ics_snippet) {
|
45
|
-
"LOL. THIS ISN'T EVEN CLOSE"
|
46
|
-
}
|
47
|
-
|
48
|
-
subject { described_class.new(invalid_ics_snippet) }
|
49
|
-
|
50
|
-
describe "#valid?" do
|
51
|
-
it "returns false" do
|
52
|
-
subject.should_not be_valid
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
end
|