drogus-blue-ridge 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 (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