rubyuw 0.99.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +4 -0
- data/README.md +81 -0
- data/Rakefile +45 -0
- data/VERSION +1 -0
- data/lib/rubyuw.rb +9 -0
- data/lib/rubyuw/base.rb +122 -0
- data/lib/rubyuw/connection.rb +145 -0
- data/lib/rubyuw/curriculum_enrollment.rb +75 -0
- data/lib/rubyuw/errors.rb +16 -0
- data/lib/rubyuw/schedule.rb +52 -0
- data/lib/rubyuw/sln.rb +108 -0
- data/rubyuw.gemspec +97 -0
- data/test/live/curriculum_enrollment_test.rb +47 -0
- data/test/live/sln_test.rb +54 -0
- data/test/live/test_helper.rb +24 -0
- data/test/mocked/base_test.rb +171 -0
- data/test/mocked/connection_test.rb +178 -0
- data/test/mocked/curriculum_enrollment_test.rb +158 -0
- data/test/mocked/fixture_pages/bad_request.html +80 -0
- data/test/mocked/fixture_pages/curric_courses.html +2659 -0
- data/test/mocked/fixture_pages/curric_no_courses.html +88 -0
- data/test/mocked/fixture_pages/curric_no_curric_found.html +86 -0
- data/test/mocked/fixture_pages/logged_in_relay.html +660 -0
- data/test/mocked/fixture_pages/login.html +121 -0
- data/test/mocked/fixture_pages/no_form_login.html +122 -0
- data/test/mocked/fixture_pages/no_login_button.html +100 -0
- data/test/mocked/fixture_pages/not_logged_in_relay.html +15 -0
- data/test/mocked/fixture_pages/registration.html +699 -0
- data/test/mocked/fixture_pages/registration_error.html +699 -0
- data/test/mocked/fixture_pages/registration_error_no_rows.html +627 -0
- data/test/mocked/fixture_pages/registration_no_form.html +700 -0
- data/test/mocked/fixture_pages/registration_success.html +718 -0
- data/test/mocked/fixture_pages/registration_unknown.html +721 -0
- data/test/mocked/fixture_pages/schedule.html +166 -0
- data/test/mocked/fixture_pages/schedule_diff_credit_row.html +167 -0
- data/test/mocked/fixture_pages/schedule_empty.html +130 -0
- data/test/mocked/fixture_pages/schedule_no_credit_row.html +169 -0
- data/test/mocked/fixture_pages/sln_does_not_exist.html +85 -0
- data/test/mocked/fixture_pages/sln_no_course_info.html +94 -0
- data/test/mocked/fixture_pages/sln_no_course_notes.html +94 -0
- data/test/mocked/fixture_pages/sln_no_enrollment_info.html +94 -0
- data/test/mocked/fixture_pages/sln_status.html +92 -0
- data/test/mocked/fixture_pages/welcome.html +93 -0
- data/test/mocked/schedule_test.rb +89 -0
- data/test/mocked/sln_test.rb +146 -0
- data/test/mocked/test_helper.rb +67 -0
- data/test/password.rb.sample +8 -0
- metadata +118 -0
@@ -0,0 +1,92 @@
|
|
1
|
+
<HTML>
|
2
|
+
<HEAD>
|
3
|
+
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
|
4
|
+
<TITLE>Current Section Status</TITLE>
|
5
|
+
<LINK REL="stylesheet" TYPE="text/css" HREF="https://www.washington.edu/home/home.css">
|
6
|
+
</HEAD>
|
7
|
+
<BODY>
|
8
|
+
|
9
|
+
<table border='0' cellpadding='0' cellspacing='0' width='100%' align='center'>
|
10
|
+
<tr>
|
11
|
+
<td width='100%' class='rpad'>
|
12
|
+
<a href='http://www.washington.edu/' target='_top'><img src='/sdb_library/images/uwlogo150p.gif' border='0' width='150' height='28' alt='University of Washington'></a>
|
13
|
+
</td>
|
14
|
+
<td rowspan='2' valign='bottom'>
|
15
|
+
|
16
|
+
<table border='0' cellpadding='0' cellspacing='0'>
|
17
|
+
<tr><td colspan='2' bgcolor='#666666'><img src='/sdb_library/images/1px_transparent.gif' height='1'></td></tr>
|
18
|
+
<tr>
|
19
|
+
<td bgcolor='#666666'><img src='/sdb_library/images/1px_transparent.gif' width='7' height='1'></td>
|
20
|
+
<td nowrap><span class='l1text'>
|
21
|
+
<a href='http://www.washington.edu/home/search.html' target='_top'>Search</A> |
|
22
|
+
<a href='http://www.washington.edu/home/directories.html' target='_top'>Directories</A> |
|
23
|
+
<a href='http://www.washington.edu/tools/' target='_top'>Reference Tools</A>
|
24
|
+
</span></td>
|
25
|
+
</tr>
|
26
|
+
</table>
|
27
|
+
|
28
|
+
</td>
|
29
|
+
</tr>
|
30
|
+
<tr>
|
31
|
+
<td bgcolor='#666666'><img src='/sdb_library/images/1px_transparent.gif' height='1'></td>
|
32
|
+
</tr>
|
33
|
+
</table>
|
34
|
+
<table border='0' cellpadding='0' cellspacing='0' width='100%'>
|
35
|
+
<tr>
|
36
|
+
<td bgcolor='#e6e6e6'><img src='/sdb_library/images/1px_transparent.gif' width='1' height='5'></TD>
|
37
|
+
</tr>
|
38
|
+
</table>
|
39
|
+
<table border='0' cellpadding='0' cellspacing='0' width='100%'>
|
40
|
+
<tr>
|
41
|
+
<td rowspan='2' nowrap><span class='l1text'>
|
42
|
+
<a href='http://www.washington.edu/' target='_top'>UW Home</A> > <a href='http://www.washington.edu/students/' target='_top'>Student Guide</A> > <a href='http://www.washington.edu/students/timeschd/' target='_top'>Time Schedule</A> > <a href='http://www.washington.edu/students/timeschd/AUT2009' target='_top'>Autumn 2009</A> > <a href='http://www.washington.edu/students/timeschd/AUT2009/phil ' target='_top'>PHILOSOPHY </A>
|
43
|
+
</span></td>
|
44
|
+
<td width='5' rowspan='3' bgcolor='#cccccc'><img src='/sdb_library/images/1px_transparent.gif' border='0' width='7' height='1'></td>
|
45
|
+
<td bgcolor='#cccccc' height='1'><img src='/sdb_library/images/1px_transparent.gif' border='0' width='1' height='1'></td>
|
46
|
+
</tr>
|
47
|
+
<tr>
|
48
|
+
<td width='100%'> </td>
|
49
|
+
</tr>
|
50
|
+
<tr>
|
51
|
+
<td bgcolor='#cccccc'><img src='/sdb_library/images/1px_transparent.gif' border='0' width='1' height='1'></td>
|
52
|
+
</tr>
|
53
|
+
</table>
|
54
|
+
<H1>Current Section Status - Autumn Quarter 2009</H1>
|
55
|
+
<P><TABLE BORDER=1 CELLPADDING=3><TR BGCOLOR="#d0d0d0"><TH>SLN</TH><TH>Course</TH><TH>Section</TH><TH>Type</TH><TH>Credits</TH><TH>Title</TH><TH>General Education<BR>and Basic Skills<BR>Requirements</TH></TR><TR ROWSPAN=1><TD><TT>17237</TT></TD><TD><TT>PHIL 120</TT></TD><TD ALIGN="center"><TT>AE </TT></TD><TD ALIGN="center"><TT>QZ</TT></TD><TD ALIGN="center"><TT> </TT></TD><TD><TT><A HREF="http://www.washington.edu/students/crscat/phil.html#phil120" TARGET="_phil120">INTRO TO LOGIC </A></TT></TD><TD><TT> </TT></TD></TR><TR><TD COLSPAN=7><TT><A HREF="http://sdb.admin.washington.edu/textbooks/query.asp?qtr=Autumn&sln1=17237" TARGET="_tb">Display Textbooks</A></TT></TD></TR></TABLE><P><TABLE BORDER=1 CELLPADDING=3><TR BGCOLOR="#d0d0d0"><TH>Current<BR>Enrollment</TH><TH>Limit</TH><TH>Room<BR>Capacity</TH><TH>Space<BR>Available</TH><TH>Status</TH></B></TR><TR><TD ALIGN="center"><TT> 25</TT></TD><TD ALIGN="center"><TT> 25</TT></TD><TD ALIGN="center"><TT> 40</TT></TD><TD ALIGN="center"><TT> </TT></TD><TD ALIGN="center"><TT><B>** Closed **</B></TT></TD></TR></TABLE>
|
56
|
+
<P><TABLE BORDER=1 CELLPADDING=3><TR BGCOLOR="#d0d0d0"><TH COLSPAN=4>Meetings</TH></TR>
|
57
|
+
<TR BGCOLOR="#d0d0d0"><TH>Days</TH><TH>Time</TH><TH>Location</TH><TH>Instructor</TH></TR>
|
58
|
+
<TR><TD NOWRAP VALIGN="top"><TT>TTh</TT></TD>
|
59
|
+
<TD NOWRAP VALIGN="top"><TT>10:30-11:20</TT></TD>
|
60
|
+
<TD NOWRAP VALIGN="top"><TT><A HREF="http://www.washington.edu/students/maps/map.cgi?DEN" TARGET="_DEN">DEN</A> 212</TT></TD>
|
61
|
+
<TD NOWRAP><TT> </TT></TD>
|
62
|
+
</TR></TABLE>
|
63
|
+
<P><TABLE BORDER=1 CELLPADDING=3><TR BGCOLOR="#d0d0d0"><TH>Notes</TH></TR><TR><TD><TT>Quiz Section </TT></TD></TR></TABLE>
|
64
|
+
<P></P>
|
65
|
+
<table border='0' cellpadding='0' cellspacing='0' align='center' width='100%'>
|
66
|
+
<tr>
|
67
|
+
<td rowspan='2'>
|
68
|
+
<a href='http://www.washington.edu/'><img src='/sdb_library/images/footersealW.gif' border='0' height='48' width='48' hspace='5' vspace='7' alt='UW Seal'></a>
|
69
|
+
</td>
|
70
|
+
<td rowspan='3' bgcolor='#666666' width='5'><img src='/sdb_library/images/1px_transparent.gif' width='7' height='1'></td>
|
71
|
+
<td colspan='2' bgcolor='#666666' height='1'><img src='/sdb_library/images/1px_transparent.gif' width='1' height='1'></td>
|
72
|
+
</tr><tr>
|
73
|
+
<td width='100%'>
|
74
|
+
<table border='0' width='100%'>
|
75
|
+
<tr>
|
76
|
+
<td valign='top'><address>
|
77
|
+
Office of the Registrar<br>
|
78
|
+
registrar@u.washington.edu<br>
|
79
|
+
June 27, 2009
|
80
|
+
</address>
|
81
|
+
</td>
|
82
|
+
</tr>
|
83
|
+
</table>
|
84
|
+
</td>
|
85
|
+
</tr><tr height='1'>
|
86
|
+
<td bgcolor='#666666'><img src='/sdb_library/images/1px_transparent.gif' width='1' height='1'></td>
|
87
|
+
</tr>
|
88
|
+
</table>
|
89
|
+
|
90
|
+
|
91
|
+
</BODY>
|
92
|
+
</HTML>
|
@@ -0,0 +1,93 @@
|
|
1
|
+
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
|
2
|
+
"http://www.w3.org/TR/html4/loose.dtd">
|
3
|
+
<html>
|
4
|
+
<head>
|
5
|
+
<title>Welcome to MyUW</title>
|
6
|
+
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
|
7
|
+
<meta http-equiv="pragma" content="no-cache">
|
8
|
+
<meta http-equiv="cache-control" content="no-cache">
|
9
|
+
<meta http-equiv="expires" content="Fri, 01 Dec 2000 00:00:00 GMT">
|
10
|
+
<meta name="author" lang="en"
|
11
|
+
content="Copyright (c) 1998- University of Washington">
|
12
|
+
|
13
|
+
<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
|
14
|
+
<link rel="stylesheet" href="/css/myuw.css" type="text/css">
|
15
|
+
<script type="text/javascript" src="/js/base.js"></script>
|
16
|
+
</head>
|
17
|
+
|
18
|
+
<body bgcolor="#ffffff" onLoad="sf()">
|
19
|
+
|
20
|
+
<table cellpadding="0" cellspacing="20" border="0" width="700" align="center">
|
21
|
+
|
22
|
+
<tr>
|
23
|
+
<td width="50%" valign="baseline">
|
24
|
+
<img src="/graphics/myuwbig.gif" border="0" alt="MyUW Logo">
|
25
|
+
</td>
|
26
|
+
|
27
|
+
<td width="2" bgcolor="#9999FF" rowspan="4"><img src="/graphics/1pixffcc33.gif"
|
28
|
+
width="1" height="1" align="BOTTOM" alt=""></td>
|
29
|
+
|
30
|
+
<td valign="middle" align="left">
|
31
|
+
Your personal gateway to the UW Web resources you use most.
|
32
|
+
</td>
|
33
|
+
</tr>
|
34
|
+
|
35
|
+
|
36
|
+
|
37
|
+
<tr>
|
38
|
+
|
39
|
+
<td align="left" style="padding-left: 10px;" valign="top">
|
40
|
+
<form method="get" name="f" action='https://myuw.washington.edu/servlet/user'><input type="submit" name="defbut" value="Log in with your UW NetID"></form></td>
|
41
|
+
|
42
|
+
<td align="left" rowspan="3" valign="top">
|
43
|
+
<a href="http://www.washington.edu/computing/uwnetid/">What is the UW NetID</a>?<br>
|
44
|
+
<a href="/info.html">Help, FAQs</a><br>
|
45
|
+
<a href="/about.html">About MyUW</a><br>
|
46
|
+
<a href="/policy.html">Privacy statement</a><br>
|
47
|
+
<a href="http://www.washington.edu/computing/rules">Appropriate use</a>
|
48
|
+
</td>
|
49
|
+
</tr>
|
50
|
+
|
51
|
+
<tr>
|
52
|
+
<td align="left" style="padding-left: 10px;" valign="top">
|
53
|
+
<form method="get" action='http://myuw.washington.edu/servlet/guest'>
|
54
|
+
<input type="submit" value="Enter as a guest"></form></td>
|
55
|
+
</tr>
|
56
|
+
|
57
|
+
<tr>
|
58
|
+
<td align="left" style="padding: 10px;">
|
59
|
+
<!--
|
60
|
+
<div style="background-color: #E6CDE6; padding: 5px;">
|
61
|
+
<a href="http://careerweek.washington.edu/">Career Discovery Week, Jan. 26-30, 2009</a><br>All three UW campuses
|
62
|
+
</div>
|
63
|
+
-->
|
64
|
+
</td>
|
65
|
+
</tr>
|
66
|
+
|
67
|
+
<tr>
|
68
|
+
<td colspan="3">
|
69
|
+
<table border="0" cellpadding="5" >
|
70
|
+
<tr><td><img src="/graphics/caution.gif" alt= "caution icon" align="right"></td>
|
71
|
+
<td>To prevent unauthorized use of your UW NetID and protect your privacy, <a href="info.html#logout"><b>Log Out</b> and completely exit your Web browser</a> when you finish.</td></table>
|
72
|
+
</td>
|
73
|
+
</tr>
|
74
|
+
|
75
|
+
<tr>
|
76
|
+
<td colspan="3">
|
77
|
+
<hr size="2" noshade >
|
78
|
+
<table border="0" cellspacing="0" cellpadding="0" width="100%">
|
79
|
+
<tr><td align="center" valign="top" width="73"><a href="http://www.washington.edu/"><img src="/graphics/UW.gif" width="53" height="37" alt="UW logo" border="0"></a></td>
|
80
|
+
<td align="left" valign="top" style="white-space:nowrap"><div class="chancontrols"><img src="/graphics/uwtech.gif" width="167" height="44" alt="UW Technology logo" align="top" border="0"></div>
|
81
|
+
<div><address><a href="/cgi-bin/contactmyuw.cgi">Contact MyUW</a><br>Copyright© 1998-2009, University of Washington<br>MyUW® is a registered trademark of the University of Washington.</address></div></td>
|
82
|
+
</tr></table>
|
83
|
+
|
84
|
+
</td>
|
85
|
+
</tr>
|
86
|
+
</table>
|
87
|
+
|
88
|
+
<script type="text/javascript">
|
89
|
+
displayAlert();
|
90
|
+
</script>
|
91
|
+
|
92
|
+
</body>
|
93
|
+
</html>
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'test_helper')
|
2
|
+
|
3
|
+
class ScheduleTest < Test::Unit::TestCase
|
4
|
+
setup do
|
5
|
+
RubyUW::Schedule.publicize_singleton_methods
|
6
|
+
end
|
7
|
+
|
8
|
+
teardown do
|
9
|
+
RubyUW::Schedule.protect_singleton_methods
|
10
|
+
end
|
11
|
+
|
12
|
+
context "getting the schedule" do
|
13
|
+
context "with authentication" do
|
14
|
+
should "raise an error if not authenticated" do
|
15
|
+
RubyUW::Base.expects(:authenticated?).returns(false)
|
16
|
+
assert_raises(RubyUW::Errors::NotLoggedInError) { RubyUW::Schedule.get }
|
17
|
+
end
|
18
|
+
|
19
|
+
should "not raise an error if authenticated" do
|
20
|
+
RubyUW::Base.expects(:authenticated?).returns(true)
|
21
|
+
assert_nothing_raised { RubyUW::Schedule.get }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context "with the mocked pages" do
|
26
|
+
setup do
|
27
|
+
RubyUW::Base.stubs(:authenticated?).returns(true)
|
28
|
+
|
29
|
+
@courses = {
|
30
|
+
"14368" => {
|
31
|
+
:course => "HIST 111 A",
|
32
|
+
:type => "LC",
|
33
|
+
:credits => "5.0",
|
34
|
+
:title => "THE ANCIENT WORLD",
|
35
|
+
:days => "MTWTh",
|
36
|
+
:time => "130-220",
|
37
|
+
:location => "SMI 120",
|
38
|
+
:instructor => "WALKER,JOEL T"
|
39
|
+
},
|
40
|
+
"14372" => {},
|
41
|
+
"12271" => {}
|
42
|
+
}
|
43
|
+
end
|
44
|
+
|
45
|
+
should "pull the right data" do
|
46
|
+
expect_get("schedule")
|
47
|
+
schedule = RubyUW::Schedule.get
|
48
|
+
|
49
|
+
assert !schedule.nil?
|
50
|
+
assert_equal @courses.length, schedule.length
|
51
|
+
schedule.each do |course|
|
52
|
+
current_course = @courses[course.sln]
|
53
|
+
assert !current_course.nil?
|
54
|
+
|
55
|
+
current_course.each do |k,v|
|
56
|
+
assert_equal v, course.data(k)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
context "extracting courses" do
|
64
|
+
setup do
|
65
|
+
@page = mock('page')
|
66
|
+
end
|
67
|
+
|
68
|
+
should "call extract_course on every result from the xpath" do
|
69
|
+
@results = [1,2,3]
|
70
|
+
@page.expects(:search).returns(@results)
|
71
|
+
RubyUW::Schedule.expects(:extract_course).times(@results.length).returns({:sln => "foo"})
|
72
|
+
RubyUW::Schedule.extract_courses(@page)
|
73
|
+
end
|
74
|
+
|
75
|
+
should "turn the results of extract_course into a RubyUW::SLN object" do
|
76
|
+
@results = [1]
|
77
|
+
@page.expects(:search).returns(@results)
|
78
|
+
RubyUW::Schedule.expects(:extract_course).once.returns({ :sln => "foo" })
|
79
|
+
RubyUW::SLN.expects(:new).once.with("foo", anything, anything)
|
80
|
+
RubyUW::Schedule.extract_courses(@page)
|
81
|
+
end
|
82
|
+
|
83
|
+
should "return an array of results" do
|
84
|
+
@page.expects(:search).returns([])
|
85
|
+
results = RubyUW::Schedule.extract_courses(@page)
|
86
|
+
assert results.empty?
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,146 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'test_helper')
|
2
|
+
|
3
|
+
class SLNTest < Test::Unit::TestCase
|
4
|
+
setup do
|
5
|
+
RubyUW::SLN.publicize_singleton_methods
|
6
|
+
end
|
7
|
+
|
8
|
+
teardown do
|
9
|
+
RubyUW::SLN.protect_singleton_methods
|
10
|
+
end
|
11
|
+
|
12
|
+
context "SLN instance" do
|
13
|
+
setup do
|
14
|
+
@sln = "foo"
|
15
|
+
@term = "bar"
|
16
|
+
@data = {
|
17
|
+
:one => "1",
|
18
|
+
:two => "2"
|
19
|
+
}
|
20
|
+
|
21
|
+
@sln_obj = RubyUW::SLN.new(@sln, @term, @data)
|
22
|
+
end
|
23
|
+
|
24
|
+
should "return data values from the field method" do
|
25
|
+
@data.each do |k,v|
|
26
|
+
assert_equal v, @sln_obj.data(k)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
should "convert to symbols so accessing by string works too" do
|
31
|
+
@data.each do |k,v|
|
32
|
+
assert_equal v, @sln_obj.data(k.to_s)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context "finding an SLN" do
|
38
|
+
context "with authentication" do
|
39
|
+
setup do
|
40
|
+
expect_get("bad_request", nil, :stubs)
|
41
|
+
RubyUW::SLN.stubs(:extract_data_from_page).returns({})
|
42
|
+
end
|
43
|
+
|
44
|
+
should "raise an error if not authenticated" do
|
45
|
+
RubyUW::Base.expects(:authenticated?).returns(false)
|
46
|
+
assert_raises(RubyUW::Errors::NotLoggedInError) { RubyUW::SLN.find("foo", "bar") }
|
47
|
+
end
|
48
|
+
|
49
|
+
should "not raise an error if authenticated" do
|
50
|
+
RubyUW::Base.expects(:authenticated?).returns(true)
|
51
|
+
assert_nothing_raised { RubyUW::SLN.find("foo", "bar") }
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context "with checking if an SLN was requested too soon" do
|
56
|
+
should "return true if the URI matches the badrequest page" do
|
57
|
+
page = mock('page')
|
58
|
+
page.stubs(:uri).returns("http://www.washington.edu/students/timeschd/badrequest.html")
|
59
|
+
|
60
|
+
assert RubyUW::SLN.requested_too_soon?(page)
|
61
|
+
end
|
62
|
+
|
63
|
+
should "convert URI to string before checking" do
|
64
|
+
uri = mock('uri')
|
65
|
+
uri.expects(:to_s).returns("http://www.washington.edu/students/timeschd/badrequest.html")
|
66
|
+
|
67
|
+
page = mock('page')
|
68
|
+
page.stubs(:uri).returns(uri)
|
69
|
+
|
70
|
+
assert RubyUW::SLN.requested_too_soon?(page)
|
71
|
+
end
|
72
|
+
|
73
|
+
should "return false if the URI is anything else" do
|
74
|
+
page = mock('page')
|
75
|
+
page.stubs(:uri).returns("foo")
|
76
|
+
|
77
|
+
assert !RubyUW::SLN.requested_too_soon?(page)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
context "with checking if an SLN exists or not" do
|
82
|
+
should "return false if the SLN does not exist string is found" do
|
83
|
+
mocked_page = RubyUW::Base.connection.get(path_to_html("sln_does_not_exist"))
|
84
|
+
|
85
|
+
assert !RubyUW::SLN.sln_exists?(mocked_page)
|
86
|
+
end
|
87
|
+
|
88
|
+
should "return true if the string is not found" do
|
89
|
+
mocked_page = RubyUW::Base.connection.get(path_to_html("sln_status"))
|
90
|
+
|
91
|
+
assert RubyUW::SLN.sln_exists?(mocked_page)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
context "with checking whether time schedule is closed" do
|
96
|
+
should "return true if the URI matches the closed page" do
|
97
|
+
page = mock('page')
|
98
|
+
page.stubs(:uri).returns("http://www.washington.edu/students/timeschd/nots.html")
|
99
|
+
|
100
|
+
assert RubyUW::SLN.time_schedule_closed?(page)
|
101
|
+
end
|
102
|
+
|
103
|
+
should "return false if the URI is anything else" do
|
104
|
+
page = mock('page')
|
105
|
+
page.stubs(:uri).returns("foo")
|
106
|
+
|
107
|
+
assert !RubyUW::SLN.time_schedule_closed?(page)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
context "raising exceptions on failures" do
|
112
|
+
setup do
|
113
|
+
RubyUW::Base.stubs(:authenticated?).returns(true)
|
114
|
+
RubyUW::SLN.stubs(:requested_too_soon?).returns(false)
|
115
|
+
RubyUW::SLN.stubs(:sln_exists?).returns(true)
|
116
|
+
RubyUW::SLN.stubs(:time_schedule_closed?).returns(false)
|
117
|
+
RubyUW::SLN.stubs(:extract_data_from_page).returns({})
|
118
|
+
|
119
|
+
page = mock('page')
|
120
|
+
RubyUW::Base.connection.stubs(:get).returns(page)
|
121
|
+
|
122
|
+
@sln = "foo"
|
123
|
+
@term = "bar"
|
124
|
+
end
|
125
|
+
|
126
|
+
should "raise SLNRequestedTooSoonError is requested too soon" do
|
127
|
+
RubyUW::SLN.expects(:requested_too_soon?).returns(true)
|
128
|
+
assert_raises(RubyUW::Errors::SLNRequestedTooSoonError) { RubyUW::SLN.find(@sln, @term) }
|
129
|
+
end
|
130
|
+
|
131
|
+
should "raise SLNDoesNotExistError if sln does not exist" do
|
132
|
+
RubyUW::SLN.expects(:sln_exists?).returns(false)
|
133
|
+
assert_raises(RubyUW::Errors::SLNDoesNotExistError) { RubyUW::SLN.find(@sln, @term) }
|
134
|
+
end
|
135
|
+
|
136
|
+
should "raise SLNServiceClosedError if the service is closed" do
|
137
|
+
RubyUW::SLN.expects(:time_schedule_closed?).returns(true)
|
138
|
+
assert_raises(RubyUW::Errors::SLNServiceClosedError) { RubyUW::SLN.find(@sln, @term) }
|
139
|
+
end
|
140
|
+
|
141
|
+
should "not raise any exception if all fail checks are valid" do
|
142
|
+
assert_nothing_raised { RubyUW::SLN.find(@sln, @term) }
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', 'lib'))
|
3
|
+
require 'rubyuw'
|
4
|
+
require 'test/unit'
|
5
|
+
require "contest"
|
6
|
+
require "stories"
|
7
|
+
require "mocha"
|
8
|
+
|
9
|
+
class Test::Unit::TestCase
|
10
|
+
def setup
|
11
|
+
RubyUW::Base.reset_connection!
|
12
|
+
RubyUW::Base.connection.follow_meta_refresh = false
|
13
|
+
end
|
14
|
+
|
15
|
+
def path_to_html(html)
|
16
|
+
"file://" + File.join(File.dirname(__FILE__), 'fixture_pages', "#{html}.html")
|
17
|
+
end
|
18
|
+
|
19
|
+
def expect_get(return_page, with=nil, expectation_type = :expects)
|
20
|
+
return_html = RubyUW::Base.connection.get(path_to_html(return_page))
|
21
|
+
expectation_obj = RubyUW::Base.connection.send(expectation_type, :get).returns(return_html)
|
22
|
+
expectation_obj.with(with) unless with.nil?
|
23
|
+
|
24
|
+
return_html
|
25
|
+
end
|
26
|
+
|
27
|
+
def mock_flow(flow)
|
28
|
+
flow_seq = sequence('flow')
|
29
|
+
|
30
|
+
flow.each do |task, params, return_html|
|
31
|
+
return_page = RubyUW::Base.connection.get(path_to_html(return_html))
|
32
|
+
|
33
|
+
relay_form = return_page.form_with(:name => 'relay')
|
34
|
+
relay_form.stubs(:submit) if relay_form
|
35
|
+
|
36
|
+
RubyUW::Base.connection.expects("execute_#{task}!").with(anything, *params).returns(return_page).in_sequence(flow_seq)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# Ugly hack. Avoiding using send() since that will not work in
|
42
|
+
# Ruby 1.9. Also, since I'm trying to make SINGLETON methods
|
43
|
+
# public, I can't do the Class.send(:public, *Class.protected_methods)
|
44
|
+
# trick. So this is the ugly hack until I can find a way around it.
|
45
|
+
# Anyone?
|
46
|
+
class Class
|
47
|
+
def publicize_singleton_methods
|
48
|
+
class << self
|
49
|
+
@_publicize_internals = protected_instance_methods
|
50
|
+
public *@_publicize_internals
|
51
|
+
end
|
52
|
+
|
53
|
+
if block_given?
|
54
|
+
yield
|
55
|
+
|
56
|
+
class <<self
|
57
|
+
protected *@_publicize_internals
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def protect_singleton_methods
|
63
|
+
class <<self
|
64
|
+
protected *@_publicize_internals
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|