jasmine-ajax 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. data/.gitignore +2 -0
  2. data/.pairs +6 -0
  3. data/Gemfile +4 -0
  4. data/Gemfile.lock +35 -0
  5. data/MIT.LICENSE +20 -0
  6. data/README.markdown +168 -0
  7. data/Rakefile +3 -0
  8. data/examples/jquery/Rakefile +2 -0
  9. data/examples/jquery/public/css/master.css +59 -0
  10. data/examples/jquery/public/css/reset.css +47 -0
  11. data/examples/jquery/public/images/fail-whale.png +0 -0
  12. data/examples/jquery/public/index.html +60 -0
  13. data/examples/jquery/public/javascripts/Tweet.js +6 -0
  14. data/examples/jquery/public/javascripts/TwitSearch.js +32 -0
  15. data/examples/jquery/public/javascripts/TwitterApi.js +31 -0
  16. data/examples/jquery/spec/SpecRunner.html +32 -0
  17. data/examples/jquery/spec/javascripts/TweetSpec.js +24 -0
  18. data/examples/jquery/spec/javascripts/TwitterApiSpec.js +88 -0
  19. data/examples/jquery/spec/javascripts/helpers/test_responses/search.js +16 -0
  20. data/examples/jquery/spec/javascripts/helpers/tweets.js +3 -0
  21. data/examples/jquery/spec/javascripts/jasmine-0.11.1/jasmine-html.js +182 -0
  22. data/examples/jquery/spec/javascripts/jasmine-0.11.1/jasmine.css +166 -0
  23. data/examples/jquery/spec/javascripts/jasmine-0.11.1/jasmine.js +2343 -0
  24. data/examples/jquery/spec/javascripts/support/jasmine.yml +78 -0
  25. data/examples/jquery/spec/javascripts/support/jasmine_runner.rb +21 -0
  26. data/examples/prototype/Rakefile +2 -0
  27. data/examples/prototype/public/css/master.css +59 -0
  28. data/examples/prototype/public/css/reset.css +47 -0
  29. data/examples/prototype/public/images/fail-whale.png +0 -0
  30. data/examples/prototype/public/index.html +45 -0
  31. data/examples/prototype/public/javascripts/Tweet.js +6 -0
  32. data/examples/prototype/public/javascripts/TwitSearch.js +32 -0
  33. data/examples/prototype/public/javascripts/TwitterApi.js +24 -0
  34. data/examples/prototype/spec/SpecRunner.html +32 -0
  35. data/examples/prototype/spec/javascripts/TweetSpec.js +24 -0
  36. data/examples/prototype/spec/javascripts/TwitterApiSpec.js +89 -0
  37. data/examples/prototype/spec/javascripts/helpers/test_responses/search.js +16 -0
  38. data/examples/prototype/spec/javascripts/helpers/tweets.js +3 -0
  39. data/examples/prototype/spec/javascripts/jasmine-0.11.1/jasmine-html.js +182 -0
  40. data/examples/prototype/spec/javascripts/jasmine-0.11.1/jasmine.css +166 -0
  41. data/examples/prototype/spec/javascripts/jasmine-0.11.1/jasmine.js +2343 -0
  42. data/examples/prototype/spec/javascripts/support/jasmine.yml +78 -0
  43. data/examples/prototype/spec/javascripts/support/jasmine_runner.rb +21 -0
  44. data/frameworks/jquery.js +8176 -0
  45. data/frameworks/prototype.js +4874 -0
  46. data/lib/assets/javascripts/mock-ajax.js +207 -0
  47. data/lib/spec-helper.js +0 -0
  48. data/lib/version.rb +5 -0
  49. data/spec/javascripts/fake-xml-http-request-spec.js +45 -0
  50. data/spec/javascripts/helpers/spec-helper.js +5 -0
  51. data/spec/javascripts/mock-ajax-jquery-spec.js +374 -0
  52. data/spec/javascripts/mock-ajax-prototypejs-spec.js +287 -0
  53. data/spec/javascripts/mock-ajax-spec.js +193 -0
  54. data/spec/javascripts/support/jasmine.yml +81 -0
  55. data/spec/javascripts/support/jasmine_runner.rb +21 -0
  56. metadata +108 -0
@@ -0,0 +1,78 @@
1
+ # src_files
2
+ #
3
+ # Return an array of filepaths relative to src_dir to include before jasmine specs.
4
+ # Default: []
5
+ #
6
+ # EXAMPLE:
7
+ #
8
+ # src_files:
9
+ # - lib/source1.js
10
+ # - lib/source2.js
11
+ # - dist/**/*.js
12
+ #
13
+ src_files:
14
+ - frameworks/jquery.js
15
+ - examples/jquery/public/javascripts/**/*.js
16
+
17
+ # stylesheets
18
+ #
19
+ # Return an array of stylesheet filepaths relative to src_dir to include before jasmine specs.
20
+ # Default: []
21
+ #
22
+ # EXAMPLE:
23
+ #
24
+ # stylesheets:
25
+ # - css/style.css
26
+ # - stylesheets/*.css
27
+ #
28
+ stylesheets:
29
+
30
+ # helpers
31
+ #
32
+ # Return an array of filepaths relative to spec_dir to include before jasmine specs.
33
+ # Default: ["helpers/**/*.js"]
34
+ #
35
+ # EXAMPLE:
36
+ #
37
+ # helpers:
38
+ # - helpers/**/*.js
39
+ #
40
+ helpers:
41
+ - lib/spec-helper.js
42
+ - examples/jquery/spec/javascripts/helpers/**/*.js
43
+
44
+ # spec_files
45
+ #
46
+ # Return an array of filepaths relative to spec_dir to include.
47
+ # Default: ["**/*[sS]pec.js"]
48
+ #
49
+ # EXAMPLE:
50
+ #
51
+ # spec_files:
52
+ # - **/*[sS]pec.js
53
+ #
54
+ spec_files:
55
+ - lib/mock-ajax.js
56
+ - examples/jquery/spec/javascripts/*.js
57
+
58
+ # src_dir
59
+ #
60
+ # Source directory path. Your src_files must be returned relative to this path. Will use root if left blank.
61
+ # Default: project root
62
+ #
63
+ # EXAMPLE:
64
+ #
65
+ # src_dir: public
66
+ #
67
+ src_dir: ../..
68
+
69
+ # spec_dir
70
+ #
71
+ # Spec directory path. Your spec_files must be returned relative to this path.
72
+ # Default: spec/javascripts
73
+ #
74
+ # EXAMPLE:
75
+ #
76
+ # spec_dir: spec/javascripts
77
+ #
78
+ spec_dir: ../..
@@ -0,0 +1,21 @@
1
+ $:.unshift(ENV['JASMINE_GEM_PATH']) if ENV['JASMINE_GEM_PATH'] # for gem testing purposes
2
+
3
+ require 'rubygems'
4
+ require 'jasmine'
5
+ jasmine_config_overrides = File.expand_path(File.join(File.dirname(__FILE__), 'jasmine_config.rb'))
6
+ require jasmine_config_overrides if File.exists?(jasmine_config_overrides)
7
+
8
+ jasmine_config = Jasmine::Config.new
9
+ spec_builder = Jasmine::SpecBuilder.new(jasmine_config)
10
+
11
+ should_stop = false
12
+
13
+ Spec::Runner.configure do |config|
14
+ config.after(:suite) do
15
+ spec_builder.stop if should_stop
16
+ end
17
+ end
18
+
19
+ spec_builder.start
20
+ should_stop = true
21
+ spec_builder.declare_suites
@@ -0,0 +1,2 @@
1
+ require 'jasmine'
2
+ load 'jasmine/tasks/jasmine.rake'
@@ -0,0 +1,59 @@
1
+ body {
2
+ margin-top: 100px;
3
+ text-align: center;
4
+ }
5
+
6
+ #wrap {
7
+ width: 800px;
8
+ margin: 0 auto;
9
+ text-align: left;
10
+ }
11
+
12
+ #twit_search {
13
+ margin-bottom: 75px;
14
+ }
15
+
16
+ #twit_search form {
17
+ color: #555555;
18
+ text-align: center;
19
+ font-size: 150%;
20
+ }
21
+
22
+ #twit_search form input[type=text] {
23
+ font-size: 100%;
24
+ color: #555555;
25
+ border: 2px solid black;
26
+ -moz-border-radius: 2px;
27
+ -webkit-border-radius: 2px;
28
+ padding: 4px 6px;
29
+ }
30
+
31
+ #twit_search form input[type=submit] {
32
+ font-size: 130%;
33
+ }
34
+
35
+ #results {
36
+ margin: 0 auto;
37
+ width: 60%;
38
+ }
39
+
40
+ #results li {
41
+ margin: 38px 0;
42
+ }
43
+
44
+ #results img {
45
+ clear: both;
46
+ margin-right: 10px;
47
+ float: left;
48
+ }
49
+
50
+ #results img + p {
51
+ font-size: 130%;
52
+ color: #333333;
53
+ }
54
+
55
+ #results p.user, #results p.timestamp {
56
+ margin-top: 5px;
57
+ text-align: right;
58
+ font-style: italic;
59
+ }
@@ -0,0 +1,47 @@
1
+ /* From http://meyerweb.com/eric/thoughts/2007/05/01/reset-reloaded/ */
2
+ html, body, div, span, applet, object, iframe,
3
+ h1, h2, h3, h4, h5, h6, p, blockquote, pre,
4
+ a, abbr, acronym, address, big, cite, code,
5
+ del, dfn, em, font, img, ins, kbd, q, s, samp,
6
+ small, strike, strong, sub, sup, tt, var,
7
+ dl, dt, dd, ol, ul, li,
8
+ fieldset, form, label, legend,
9
+ table, caption, tbody, tfoot, thead, tr, th, td {
10
+ margin: 0;
11
+ padding: 0;
12
+ border: 0;
13
+ outline: 0;
14
+ font-weight: inherit;
15
+ font-style: inherit;
16
+ font-size: 100%;
17
+ font-family: inherit;
18
+ vertical-align: baseline;
19
+ }
20
+ /* remember to define focus styles! */
21
+ :focus {
22
+ outline: 0;
23
+ }
24
+ body {
25
+ line-height: 1;
26
+ color: black;
27
+ background: white;
28
+ }
29
+ ol, ul {
30
+ list-style: none;
31
+ }
32
+ /* tables still need 'cellspacing="0"' in the markup */
33
+ table {
34
+ border-collapse: separate;
35
+ border-spacing: 0;
36
+ }
37
+ caption, th, td {
38
+ text-align: left;
39
+ font-weight: normal;
40
+ }
41
+ blockquote:before, blockquote:after,
42
+ q:before, q:after {
43
+ content: "";
44
+ }
45
+ blockquote, q {
46
+ quotes: "" "";
47
+ }
@@ -0,0 +1,45 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+
4
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
5
+ <head>
6
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
7
+
8
+ <title>Jasmine BDD</title>
9
+ <link rel="stylesheet" type="text/css" href="css/reset.css" />
10
+ <link rel="stylesheet" type="text/css" href="css/master.css" />
11
+ <script type="text/javascript" src="../../../frameworks/prototype.js"></script>
12
+ <script type="text/javascript" src="javascripts/TwitSearch.js"></script>
13
+ <script type="text/javascript" src="javascripts/TwitterApi.js"></script>
14
+ <script type="text/javascript" src="javascripts/Tweet.js"></script>
15
+ </head>
16
+
17
+ <body>
18
+ <div id="wrap">
19
+ <div id="twit_search">
20
+ <form action="index.html#" method="get">
21
+ <input type="text" name="query" id="query" />
22
+ <input type="submit" value="Search Twitter" />
23
+ </form>
24
+ </div>
25
+ <ul id="results"></ul>
26
+ <script type="text/javascript">
27
+
28
+ document.observe('dom:loaded', function(){
29
+ $$("#twit_search form").first().observe("submit", function(event) {
30
+ event.preventDefault();
31
+ var search_query = $("query").value
32
+ new TwitterApi().search(
33
+ search_query, {
34
+ onSuccess: TwitSearch.displayResults,
35
+ onFailure: TwitSearch.searchFailure,
36
+ onComplete: TwitSearch.cleanup,
37
+ onFailWhale: TwitSearch.failWhale
38
+ }
39
+ );
40
+ });
41
+ });
42
+ </script>
43
+ </div>
44
+ </body>
45
+ </html>
@@ -0,0 +1,6 @@
1
+ function Tweet(tweet){
2
+ this.postedAt = tweet.created_at;
3
+ this.text = tweet.text;
4
+ this.imageUrl = tweet.profile_image_url;
5
+ this.user = tweet.from_user;
6
+ }
@@ -0,0 +1,32 @@
1
+ var TwitSearch = function(){
2
+
3
+ return {
4
+ displayResults: function(tweets){
5
+ var update_str = "";
6
+
7
+ tweets.each(function(tweet) {
8
+ update_str += "<li><img src='" + tweet.imageUrl + "' alt='" + tweet.user + " profile image' />" +
9
+ "<p>" + tweet.text + "</p>" +
10
+ "<p class='user'>" + tweet.user + "</p>" +
11
+ "<p class='timestamp'>" + tweet.postedAt + "</p>";
12
+
13
+ });
14
+
15
+ $("results").update(update_str);
16
+ },
17
+
18
+ searchFailure: function(response){
19
+ $("results").update("<h2>Oops. Something went wrong.</h2>");
20
+ },
21
+
22
+ cleanup: function(){},
23
+
24
+ rateLimitReached: function(){
25
+ console.log("rate limited");
26
+ },
27
+
28
+ failWhale: function(){
29
+ $("results").update("<img src='images/fail-whale.png' />");
30
+ }
31
+ }
32
+ }();
@@ -0,0 +1,24 @@
1
+ function TwitterApi () {
2
+ this.baseUrl = "http://search.twitter.com/search.json"
3
+ }
4
+
5
+ TwitterApi.prototype.search = function(query, callbacks) {
6
+ this.currentRequest = new Ajax.Request(this.baseUrl, {
7
+ method: 'get',
8
+ parameters: {
9
+ q: query
10
+ },
11
+
12
+ onSuccess: function(response){
13
+ var tweets = [];
14
+ response.responseJSON.results.each(function(result){
15
+ tweets.push(new Tweet(result));
16
+ });
17
+
18
+ callbacks.onSuccess(tweets);
19
+ },
20
+ onFailure: callbacks.onFailure,
21
+ onComplete: callbacks.onComplete,
22
+ on503: callbacks.onFailWhale
23
+ });
24
+ };
@@ -0,0 +1,32 @@
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>Jasmine Test Runner</title>
6
+ <link rel="stylesheet" type="text/css" href="javascripts/jasmine-0.11.1/jasmine.css" />
7
+ <script type="text/javascript" src="javascripts/jasmine-0.11.1/jasmine.js"></script>
8
+ <script type="text/javascript" src="javascripts/jasmine-0.11.1/jasmine-html.js"></script>
9
+
10
+ <!-- include source files here... -->
11
+ <script type="text/javascript" src="../../../frameworks/prototype.js"></script>
12
+ <script type="text/javascript" src="../public/javascripts/Tweet.js"></script>
13
+ <script type="text/javascript" src="../public/javascripts/TwitSearch.js"></script>
14
+ <script type="text/javascript" src="../public/javascripts/TwitterApi.js"></script>
15
+
16
+ <!-- include spec files here... -->
17
+ <script type="text/javascript" src="../../../lib/mock-ajax.js"></script>
18
+ <script type="text/javascript" src="../../../lib/spec-helper.js"></script>
19
+ <script type="text/javascript" src="javascripts/helpers/test_responses/search.js"></script>
20
+ <script type="text/javascript" src="javascripts/helpers/tweets.js"></script>
21
+ <script type="text/javascript" src="javascripts/TweetSpec.js"></script>
22
+ <script type="text/javascript" src="javascripts/TwitterApiSpec.js"></script>
23
+
24
+ </head>
25
+ <body>
26
+ <script type="text/javascript">
27
+ jasmine.getEnv().addReporter(new jasmine.TrivialReporter());
28
+ jasmine.getEnv().execute();
29
+ </script>
30
+
31
+ </body>
32
+ </html>
@@ -0,0 +1,24 @@
1
+ describe("Tweet", function(){
2
+ var tweet;
3
+
4
+ beforeEach(function(){
5
+ tweet = new Tweet(eval('(' + Tweets.noAtReply + ')'));
6
+ });
7
+
8
+ it("should create a pretty date", function(){
9
+ expect(tweet.postedAt).toEqual("Thu, 29 Jul 2010 02:18:53 +0000");
10
+ });
11
+
12
+ it("should store the users messages", function(){
13
+ expect(tweet.text).toEqual("Pres Obama on stage with the Foo fighters, jonas brothers and a whole lot of ppl..nice..");
14
+ });
15
+
16
+ it("should store the username", function(){
17
+ expect(tweet.user).toEqual("_wbrodrigues");
18
+ });
19
+
20
+ it("stores the users messages", function(){
21
+ expect(tweet.imageUrl).toEqual("http://a2.twimg.com/profile_images/1014111170/06212010155_normal.jpg");
22
+ });
23
+
24
+ });
@@ -0,0 +1,89 @@
1
+ describe("TwitterApi#search", function(){
2
+ var twitter, request;
3
+ var onSuccess, onFailure, onComplete, onFailWhale;
4
+
5
+ beforeEach(function(){
6
+ jasmine.Ajax.useMock();
7
+
8
+ onSuccess = jasmine.createSpy('onSuccess');
9
+ onFailure = jasmine.createSpy('onFailure');
10
+ onComplete = jasmine.createSpy('onComplete');
11
+ onFailWhale = jasmine.createSpy('onFailWhale');
12
+
13
+ twitter = new TwitterApi();
14
+
15
+ twitter.search('basketball', {
16
+ onSuccess: onSuccess,
17
+ onFailure: onFailure,
18
+ onComplete: onComplete,
19
+ onFailWhale: onFailWhale
20
+ });
21
+
22
+ request = mostRecentAjaxRequest();
23
+ });
24
+
25
+ it("calls Twitter with the correct url", function(){
26
+ expect(request.url).toEqual("http://search.twitter.com/search.json?q=basketball")
27
+ });
28
+
29
+ describe("on success", function(){
30
+ beforeEach(function(){
31
+ request.response(TestResponses.search.success);
32
+ });
33
+
34
+ it("should call the provided success callback", function() {
35
+ expect(onSuccess).toHaveBeenCalled();
36
+ });
37
+
38
+ it("calls onComplete", function(){
39
+ expect(onComplete).toHaveBeenCalled();
40
+ });
41
+
42
+ it("does not call onFailure", function(){
43
+ expect(onFailure).not.toHaveBeenCalled();
44
+ });
45
+
46
+ it("call convert the server response to Tweet objects", function(){
47
+ var results = onSuccess.mostRecentCall.args[0];
48
+
49
+ expect(results.length).toEqual(15);
50
+ expect(results[0]).toEqual(jasmine.any(Tweet));
51
+ });
52
+ });
53
+
54
+ describe('on failure', function(){
55
+ beforeEach(function(){
56
+ request.response(TestResponses.search.failure);
57
+ });
58
+
59
+ it("calls onFailure", function() {
60
+ expect(onFailure).toHaveBeenCalled();
61
+ });
62
+
63
+ it("call onComplete", function(){
64
+ expect(onComplete).toHaveBeenCalled();
65
+ });
66
+
67
+ it("does not call onSuccess", function(){
68
+ expect(onSuccess).not.toHaveBeenCalled();
69
+ });
70
+ });
71
+
72
+ describe("on fail whale", function(){
73
+ beforeEach(function(){
74
+ request.response(TestResponses.search.failWhale);
75
+ });
76
+
77
+ it("calls onFailWhale", function(){
78
+ expect(onFailWhale).toHaveBeenCalled();
79
+ });
80
+
81
+ it("does not call onSuccess", function(){
82
+ expect(onSuccess).not.toHaveBeenCalled();
83
+ });
84
+
85
+ it("calls onComplete", function(){
86
+ expect(onComplete).toHaveBeenCalled();
87
+ });
88
+ });
89
+ });