jasmine-ajax 0.0.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.
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
+ });