drogus-blue-ridge 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. data/LICENSE +20 -0
  2. data/LICENSE-Screw.Unit +22 -0
  3. data/LICENSE-Smoke +22 -0
  4. data/README.markdown +256 -0
  5. data/Rakefile +65 -0
  6. data/VERSION +1 -0
  7. data/blue_ridge_generators/blue_ridge/USAGE +5 -0
  8. data/blue_ridge_generators/blue_ridge/blue_ridge_generator.rb +19 -0
  9. data/blue_ridge_generators/blue_ridge/templates/application.html +16 -0
  10. data/blue_ridge_generators/blue_ridge/templates/application_spec.js +15 -0
  11. data/blue_ridge_generators/blue_ridge/templates/javascript_spec_helper.rb +44 -0
  12. data/blue_ridge_generators/blue_ridge/templates/screw.css +90 -0
  13. data/blue_ridge_generators/blue_ridge/templates/spec_helper.js +1 -0
  14. data/blue_ridge_generators/javascript_spec/USAGE +5 -0
  15. data/blue_ridge_generators/javascript_spec/javascript_spec_generator.rb +52 -0
  16. data/blue_ridge_generators/javascript_spec/templates/fixture.html.erb +13 -0
  17. data/blue_ridge_generators/javascript_spec/templates/fixture_render_spec.rb.erb +10 -0
  18. data/blue_ridge_generators/javascript_spec/templates/javascript_spec.js.erb +10 -0
  19. data/lib/blue-ridge.js +73 -0
  20. data/lib/consoleReportForRake.js +32 -0
  21. data/lib/env.rhino.js +8841 -0
  22. data/lib/jquery-1.2.6.js +3549 -0
  23. data/lib/jquery-1.3.2.js +4376 -0
  24. data/lib/jquery.fn.js +29 -0
  25. data/lib/jquery.print.js +109 -0
  26. data/lib/js.jar +0 -0
  27. data/lib/screw.behaviors.js +92 -0
  28. data/lib/screw.builder.js +82 -0
  29. data/lib/screw.events.js +45 -0
  30. data/lib/screw.matchers.js +187 -0
  31. data/lib/screw.mocking.js +26 -0
  32. data/lib/shell.js +27 -0
  33. data/lib/smoke.core.js +49 -0
  34. data/lib/smoke.mock.js +171 -0
  35. data/lib/smoke.stub.js +29 -0
  36. data/lib/test_runner.js +58 -0
  37. data/spec/fixtures/rails_project/app/controllers/accounts_controller.rb +85 -0
  38. data/spec/fixtures/rails_project/app/controllers/application_controller.rb +10 -0
  39. data/spec/fixtures/rails_project/app/controllers/home_controller.rb +5 -0
  40. data/spec/fixtures/rails_project/app/helpers/accounts_helper.rb +2 -0
  41. data/spec/fixtures/rails_project/app/helpers/application_helper.rb +13 -0
  42. data/spec/fixtures/rails_project/app/helpers/home_helper.rb +2 -0
  43. data/spec/fixtures/rails_project/app/models/account.rb +3 -0
  44. data/spec/fixtures/rails_project/config/boot.rb +110 -0
  45. data/spec/fixtures/rails_project/config/environment.rb +41 -0
  46. data/spec/fixtures/rails_project/config/environments/cucumber.rb +25 -0
  47. data/spec/fixtures/rails_project/config/environments/development.rb +17 -0
  48. data/spec/fixtures/rails_project/config/environments/production.rb +28 -0
  49. data/spec/fixtures/rails_project/config/environments/test.rb +35 -0
  50. data/spec/fixtures/rails_project/config/initializers/backtrace_silencers.rb +7 -0
  51. data/spec/fixtures/rails_project/config/initializers/inflections.rb +10 -0
  52. data/spec/fixtures/rails_project/config/initializers/mime_types.rb +5 -0
  53. data/spec/fixtures/rails_project/config/initializers/new_rails_defaults.rb +19 -0
  54. data/spec/fixtures/rails_project/config/initializers/session_store.rb +2 -0
  55. data/spec/fixtures/rails_project/config/routes.rb +47 -0
  56. data/spec/fixtures/rails_project/db/migrate/20090719005327_create_sessions.rb +16 -0
  57. data/spec/fixtures/rails_project/db/migrate/20090719031606_create_accounts.rb +13 -0
  58. data/spec/fixtures/rails_project/db/schema.rb +30 -0
  59. data/spec/fixtures/rails_project/spec/spec_helper.rb +52 -0
  60. data/tasks/javascript_testing_tasks.rake +84 -0
  61. data/test/test_blue_ridge_generator.rb +48 -0
  62. data/test/test_generator_helper.rb +29 -0
  63. data/test/test_javascript_spec_generator.rb +57 -0
  64. metadata +148 -0
@@ -0,0 +1,26 @@
1
+ // This is a lightweight bridge between Smoke and Screw.Unit.
2
+ // It shadows mocking and stubbing onto the matchers to make them available within tests.
3
+
4
+ Screw.Matchers.mock = function(m) {
5
+ return Smoke.Mock(m);
6
+ };
7
+
8
+ Screw.Matchers.mock_function = function(func,name) {
9
+ return Smoke.MockFunction(func,name);
10
+ };
11
+
12
+ Screw.Matchers.stub = function(obj, attr) {
13
+ return new Smoke.Stub(obj,attr);
14
+ };
15
+
16
+ (function($) {
17
+ $(Screw).bind("before", function(){
18
+ function checkAndResetSmoke() {
19
+ Smoke.checkExpectations();
20
+ Smoke.reset();
21
+ }
22
+
23
+ $('.it').bind('passed', function(){ checkAndResetSmoke() });
24
+ $('.it').bind('failed', function(){ checkAndResetSmoke() });
25
+ });
26
+ })(jQuery);
@@ -0,0 +1,27 @@
1
+ (function(){
2
+ var _old_quit = this.quit;
3
+ this.__defineGetter__("exit", function(){ _old_quit() });
4
+ this.__defineGetter__("quit", function(){ _old_quit() });
5
+
6
+ print("=================================================");
7
+ print(" Rhino JavaScript Shell");
8
+ print(" To exit type 'exit', 'quit', or 'quit()'.");
9
+ print("=================================================");
10
+
11
+ var plugin_prefix = environment["blue.ridge.prefix"] || "vendor/plugins/blue-ridge";
12
+ var fixture_file = plugin_prefix + "/generators/blue_ridge/templates/application.html";
13
+
14
+ load(plugin_prefix + "/lib/env.rhino.js");
15
+ print(" - loaded env.js");
16
+
17
+ window.location = fixture_file;
18
+ print(" - sample DOM loaded");
19
+
20
+ load(plugin_prefix + "/lib/jquery-1.3.2.js");
21
+ print(" - jQuery-1.3.2 loaded");
22
+
23
+ load(plugin_prefix + "/lib/jquery.print.js");
24
+ print(" - jQuery print lib loaded");
25
+
26
+ print("=================================================");
27
+ })();
@@ -0,0 +1,49 @@
1
+ Smoke = {
2
+ print: function(v) {
3
+ // use the jquery print plugin if it is available or fall back to toString();
4
+ return (jQuery && jQuery.print) ? jQuery.print(v) : v.toString();
5
+ },
6
+
7
+ printArguments: function(args) {
8
+ var a = [];
9
+ if (args === undefined) args = '';
10
+ if ((args && args.callee) || (args instanceof Array)) {
11
+ for(var i = 0; i < args.length; i++) {
12
+ a.push(Smoke.print(args[i]));
13
+ }
14
+ } else {
15
+ // Workaround for jQuery.print returning "null" when called with an empty string.
16
+ if (!args && (typeof args == 'string')) {
17
+ a.push('');
18
+ } else {
19
+ a.push(Smoke.print(args));
20
+ }
21
+ }
22
+ return '(' + a.join(', ') + ')';
23
+ },
24
+
25
+ argumentsToArray: function(args) {
26
+ return Array.prototype.slice.call(args);
27
+ },
28
+
29
+ compare: function(a, b) {
30
+ if (a === b) return true;
31
+ if (a instanceof Array) {
32
+ if (b.length != a.length) return false;
33
+ for (var i = 0; i < b.length; i++)
34
+ if (!this.compare(a[i], b[i])) return false;
35
+ } else if (a instanceof Object) {
36
+ for (var key in a)
37
+ if (!this.compare(a[key], b[key])) return false;
38
+ for (var key in b)
39
+ if (!this.compare(b[key], a[key])) return false;
40
+ } else {
41
+ return false;
42
+ }
43
+ return true;
44
+ },
45
+
46
+ compareArguments: function(a, b) {
47
+ return this.compare(Smoke.argumentsToArray(a), Smoke.argumentsToArray(b));
48
+ }
49
+ };
@@ -0,0 +1,171 @@
1
+ // Overide these functions for custom pass/fail behaviours
2
+ Smoke.passed = function(mock){
3
+ Smoke.passCount++;
4
+ };
5
+
6
+ Smoke.failed = function(mock, message){
7
+ Smoke.failCount++;
8
+ throw(message);
9
+ };
10
+
11
+ // Some helpers
12
+ Smoke.reset = function(){
13
+ Smoke.mocks = Smoke.mocks || [];
14
+ for(var i=0; i<Smoke.mocks.length; i++) Smoke.mocks[i]._resetMocks();
15
+ Smoke.mocks = [];
16
+ Smoke.passCount = 0;
17
+ Smoke.failCount = 0;
18
+ };
19
+ Smoke.reset();
20
+
21
+ Smoke.checkExpectations = function(){
22
+ for(var i=0; i<Smoke.mocks.length; i++) Smoke.mocks[i]._checkExpectations();
23
+ };
24
+
25
+ Smoke.Mock = function(originalObj) {
26
+ var obj = originalObj || {} ;
27
+ obj._expectations = {};
28
+ obj._valuesBeforeMocking = {};
29
+
30
+ obj.stub = function(attr){
31
+ return new Smoke.Stub(this, attr);
32
+ };
33
+
34
+ obj.should_receive = function(attr){
35
+ var expectation = new Smoke.Mock.Expectation(this, attr);
36
+ this._expectations[attr] = (this._expectations[attr] || []).concat([expectation]);
37
+ this._valuesBeforeMocking[attr] = this[attr];
38
+ if(this._expectations[attr].length == 1) {
39
+ this[attr] = Smoke.Mock.Expectation.stub(this, attr);
40
+ }
41
+ return expectation;
42
+ };
43
+
44
+ obj._checkExpectations = function(){
45
+ for(var e in this._expectations) {
46
+ var expectations = this._expectations[e]
47
+ for(var i=0; i < expectations.length; i++) expectations[i].check();
48
+ };
49
+ };
50
+
51
+ obj._resetMocks = function(){
52
+ for(var attr in this._valuesBeforeMocking) {
53
+ this[attr] = this._valuesBeforeMocking[attr];
54
+ }
55
+
56
+ delete this._valuesBeforeMocking;
57
+ delete this._expectations;
58
+ delete this._resetMocks;
59
+ delete this._checkExpectations;
60
+ delete this.stub;
61
+ delete this.should_receive;
62
+ };
63
+
64
+ Smoke.mocks.push(obj);
65
+ return obj;
66
+ };
67
+
68
+ Smoke.MockFunction = function(originalFunction, name) {
69
+ name = name || 'anonymous_function';
70
+ var mock = Smoke.Mock(function() {
71
+ var return_value = arguments.callee[name].apply(this, arguments);
72
+ if (return_value === undefined) {
73
+ return_value = (originalFunction || new Function()).apply(this, arguments)
74
+ }
75
+ return return_value;
76
+ });
77
+ mock[name] = (originalFunction || new Function());
78
+ mock.should_be_invoked = function() {
79
+ return this.should_receive(name);
80
+ }
81
+ return mock;
82
+ };
83
+
84
+ Smoke.Mock.Expectation = function(mock, attr) {
85
+ this._mock = mock;
86
+ this._attr = attr;
87
+ this.callCount = 0;
88
+ this.returnValue = undefined;
89
+ this.callerArgs = undefined;
90
+ this.hasReturnValue = false;
91
+ };
92
+
93
+ Smoke.Mock.Expectation.stub = function(mock, attr) {
94
+ return function() {
95
+ return function() {
96
+ var matched, return_value, args = arguments;
97
+ jQuery.each(this, function() {
98
+ this.run(args) && (matched = true) && (return_value = this.returnValue);
99
+ });
100
+ if (!matched) {
101
+ this[0].argumentMismatchError(args)
102
+ }
103
+ return return_value;
104
+ }.apply(mock._expectations[attr], arguments);
105
+ }
106
+ }
107
+
108
+
109
+ Smoke.Mock.Expectation.prototype = {
110
+ exactly: function(count,type){
111
+ // type isn't used for now, it's just syntax ;)
112
+ this.minCount = this.maxCount = undefined;
113
+ this.exactCount = this.parseCount(count);
114
+ return this;
115
+ },
116
+ at_most: function(count,type){
117
+ this.maxCount = this.parseCount(count);
118
+ return this;
119
+ },
120
+ at_least: function(count,type){
121
+ this.minCount = this.parseCount(count);
122
+ return this;
123
+ },
124
+ with_arguments: function(){
125
+ this.callerArgs = arguments;
126
+ return this
127
+ },
128
+ run: function(args){
129
+ if((this.callerArgs === undefined) || Smoke.compareArguments(args, this.callerArgs)) {
130
+ return !!(this.callCount+=1);
131
+ };
132
+ return false
133
+ },
134
+ and_return: function(v){
135
+ this.hasReturnValue = true;
136
+ this.returnValue = v;
137
+ },
138
+ check: function(){
139
+ if(this.exactCount!=undefined) this.checkExactCount();
140
+ if(this.minCount!=undefined) this.checkMinCount();
141
+ if(this.maxCount!=undefined) this.checkMaxCount();
142
+ },
143
+ checkExactCount: function(){
144
+ if(this.exactCount==this.callCount) Smoke.passed(this)//console.log('Mock passed!')
145
+ else Smoke.failed(this, 'expected '+this.methodSignature()+' to be called exactly '+this.exactCount+" times but it got called "+this.callCount+' times');
146
+ },
147
+ checkMinCount: function(){
148
+ if(this.minCount<=this.callCount) Smoke.passed(this);
149
+ else Smoke.failed(this, 'expected '+this.methodSignature()+' to be called at least '+this.minCount+" times but it only got called "+this.callCount+' times');
150
+ },
151
+ checkMaxCount: function(){
152
+ if(this.maxCount>=this.callCount) Smoke.passed(this);//console.log('Mock passed!')
153
+ else Smoke.failed(this, 'expected '+this.methodSignature()+' to be called at most '+this.maxCount+" times but it actually got called "+this.callCount+' times');
154
+ },
155
+ argumentMismatchError: function(args) {
156
+ Smoke.failed(this, 'expected ' + this._attr + ' with ' + Smoke.printArguments(this.callerArgs) + ' but received it with ' + Smoke.printArguments(args));
157
+ },
158
+ methodSignature: function(){
159
+ return this._attr + Smoke.printArguments(this.callerArgs);
160
+ },
161
+ parseCount: function(c){
162
+ switch(c){
163
+ case 'once':
164
+ return 1;
165
+ case 'twice':
166
+ return 2;
167
+ default:
168
+ return c;
169
+ }
170
+ }
171
+ };
@@ -0,0 +1,29 @@
1
+ Smoke.Stub = function(obj,attr) {
2
+ this.obj = obj;
3
+ this.attribute = attr;
4
+ this.and_return(this.defaultReturn);
5
+ };
6
+
7
+ Smoke.Stub.prototype = {
8
+ defaultReturn: null,
9
+ property: function(p){
10
+ this.property = p;
11
+ this.and_set_to(this.defaultReturn);
12
+ return this
13
+ },
14
+ method: function(f){
15
+ this.func = f;
16
+ this.and_return(this.defaultReturn);
17
+ return this
18
+ },
19
+ and_return: function(v){
20
+ this.obj[this.attribute] = function() {
21
+ return v
22
+ };
23
+ return this.obj
24
+ },
25
+ and_set_to: function(v){
26
+ this.obj[this.attribute] = v;
27
+ return this.obj
28
+ }
29
+ };
@@ -0,0 +1,58 @@
1
+ if(arguments.length == 0) {
2
+ print("Usage: test_runner.js spec/javascripts/file_spec.js");
3
+ quit(1);
4
+ }
5
+
6
+ var PLUGIN_PREFIX = environment["blue.ridge.prefix"] || "../../vendor/plugins/blue-ridge";
7
+
8
+ var BlueRidge = {
9
+ require: function(file, options){
10
+ load(file);
11
+
12
+ options = options || {};
13
+ if(options['onload']) {
14
+ options['onload'].call();
15
+ }
16
+ },
17
+
18
+ css: function(url, options) {
19
+ // can do nothing in test_runner
20
+ },
21
+
22
+ debug: function(message){
23
+ print(message);
24
+ },
25
+
26
+ get fixtureFile(){
27
+ return "fixtures/" + this.specFile.replace(/^(.*?)_spec\.js$/, "$1.html");
28
+ }
29
+ };
30
+
31
+ BlueRidge.specFile = arguments[0];
32
+
33
+ var require = require || BlueRidge.require;
34
+ var css = css || BlueRidge.css;
35
+ var debug = debug || BlueRidge.debug;
36
+
37
+ // Mock up the Firebug API for convenience.
38
+ var console = console || {debug: debug};
39
+
40
+ load(PLUGIN_PREFIX + "/lib/env.rhino.js");
41
+ window.location = BlueRidge.fixtureFile;
42
+
43
+ load(PLUGIN_PREFIX + "/lib/jquery-1.3.2.js");
44
+ load(PLUGIN_PREFIX + "/lib/jquery.fn.js");
45
+ load(PLUGIN_PREFIX + "/lib/jquery.print.js");
46
+ load(PLUGIN_PREFIX + "/lib/screw.builder.js");
47
+ load(PLUGIN_PREFIX + "/lib/screw.matchers.js");
48
+ load(PLUGIN_PREFIX + "/lib/screw.events.js");
49
+ load(PLUGIN_PREFIX + "/lib/screw.behaviors.js");
50
+ load(PLUGIN_PREFIX + "/lib/smoke.core.js");
51
+ load(PLUGIN_PREFIX + "/lib/smoke.mock.js");
52
+ load(PLUGIN_PREFIX + "/lib/smoke.stub.js");
53
+ load(PLUGIN_PREFIX + "/lib/screw.mocking.js");
54
+ load(PLUGIN_PREFIX + "/lib/consoleReportForRake.js");
55
+
56
+ print("Running " + BlueRidge.specFile + " with fixture '" + BlueRidge.fixtureFile + "'...");
57
+ load(BlueRidge.specFile);
58
+ jQuery(window).trigger("load");
@@ -0,0 +1,85 @@
1
+ class AccountsController < ApplicationController
2
+ # GET /accounts
3
+ # GET /accounts.xml
4
+ def index
5
+ @accounts = Account.all
6
+
7
+ respond_to do |format|
8
+ format.html # index.html.erb
9
+ format.xml { render :xml => @accounts }
10
+ end
11
+ end
12
+
13
+ # GET /accounts/1
14
+ # GET /accounts/1.xml
15
+ def show
16
+ @account = Account.find(params[:id])
17
+
18
+ respond_to do |format|
19
+ format.html # show.html.erb
20
+ format.xml { render :xml => @account }
21
+ end
22
+ end
23
+
24
+ # GET /accounts/new
25
+ # GET /accounts/new.xml
26
+ def new
27
+ @account = Account.new
28
+
29
+ respond_to do |format|
30
+ format.html # new.html.erb
31
+ format.xml { render :xml => @account }
32
+ end
33
+ end
34
+
35
+ # GET /accounts/1/edit
36
+ def edit
37
+ @account = Account.find(params[:id])
38
+ end
39
+
40
+ # POST /accounts
41
+ # POST /accounts.xml
42
+ def create
43
+ @account = Account.new(params[:account])
44
+
45
+ respond_to do |format|
46
+ if @account.save
47
+ flash[:notice] = 'Account was successfully created.'
48
+ format.html { redirect_to(@account) }
49
+ format.xml { render :xml => @account, :status => :created, :location => @account }
50
+ else
51
+ format.html { render :action => "new" }
52
+ format.xml { render :xml => @account.errors, :status => :unprocessable_entity }
53
+ end
54
+ end
55
+ end
56
+
57
+ # PUT /accounts/1
58
+ # PUT /accounts/1.xml
59
+ def update
60
+ @account = Account.find(params[:id])
61
+
62
+ respond_to do |format|
63
+ if @account.update_attributes(params[:account])
64
+ flash[:notice] = 'Account was successfully updated.'
65
+ format.html { redirect_to(@account) }
66
+ format.xml { head :ok }
67
+ else
68
+ format.html { render :action => "edit" }
69
+ format.xml { render :xml => @account.errors, :status => :unprocessable_entity }
70
+ end
71
+ end
72
+ end
73
+
74
+ # DELETE /accounts/1
75
+ # DELETE /accounts/1.xml
76
+ def destroy
77
+ @account = Account.find(params[:id])
78
+ @account.destroy
79
+
80
+ respond_to do |format|
81
+ format.html { redirect_to(accounts_url) }
82
+ format.xml { head :ok }
83
+ end
84
+ end
85
+ end