aslakjo-comatose 2.0.5.2
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/CHANGELOG +195 -0
- data/INSTALL +20 -0
- data/LICENSE +20 -0
- data/MANIFEST +91 -0
- data/README.markdown +159 -0
- data/Rakefile +176 -0
- data/SPECS +61 -0
- data/about.yml +7 -0
- data/bin/comatose +112 -0
- data/comatose.gemspec +113 -0
- data/generators/comatose_migration/USAGE +15 -0
- data/generators/comatose_migration/comatose_migration_generator.rb +74 -0
- data/generators/comatose_migration/templates/migration.rb +35 -0
- data/generators/comatose_migration/templates/v4_upgrade.rb +15 -0
- data/generators/comatose_migration/templates/v6_upgrade.rb +23 -0
- data/generators/comatose_migration/templates/v7_upgrade.rb +22 -0
- data/init.rb +2 -0
- data/install.rb +18 -0
- data/lib/acts_as_versioned.rb +543 -0
- data/lib/comatose/comatose_drop.rb +79 -0
- data/lib/comatose/configuration.rb +69 -0
- data/lib/comatose/page_wrapper.rb +119 -0
- data/lib/comatose/processing_context.rb +69 -0
- data/lib/comatose/tasks/admin.rb +60 -0
- data/lib/comatose/tasks/data.rb +82 -0
- data/lib/comatose/tasks/setup.rb +52 -0
- data/lib/comatose/version.rb +4 -0
- data/lib/comatose.rb +33 -0
- data/lib/comatose_admin_controller.rb +395 -0
- data/lib/comatose_admin_helper.rb +37 -0
- data/lib/comatose_controller.rb +138 -0
- data/lib/comatose_helper.rb +3 -0
- data/lib/comatose_page.rb +141 -0
- data/lib/liquid/block.rb +96 -0
- data/lib/liquid/context.rb +190 -0
- data/lib/liquid/document.rb +17 -0
- data/lib/liquid/drop.rb +48 -0
- data/lib/liquid/errors.rb +7 -0
- data/lib/liquid/extensions.rb +53 -0
- data/lib/liquid/file_system.rb +62 -0
- data/lib/liquid/htmltags.rb +64 -0
- data/lib/liquid/standardfilters.rb +111 -0
- data/lib/liquid/standardtags.rb +399 -0
- data/lib/liquid/strainer.rb +42 -0
- data/lib/liquid/tag.rb +25 -0
- data/lib/liquid/template.rb +88 -0
- data/lib/liquid/variable.rb +39 -0
- data/lib/liquid.rb +52 -0
- data/lib/redcloth.rb +1129 -0
- data/lib/support/class_options.rb +36 -0
- data/lib/support/inline_rendering.rb +48 -0
- data/lib/support/route_mapper.rb +50 -0
- data/lib/text_filters/markdown.rb +14 -0
- data/lib/text_filters/markdown_smartypants.rb +15 -0
- data/lib/text_filters/none.rb +8 -0
- data/lib/text_filters/rdoc.rb +13 -0
- data/lib/text_filters/simple.rb +8 -0
- data/lib/text_filters/textile.rb +15 -0
- data/lib/text_filters.rb +140 -0
- data/rails/init.rb +3 -0
- data/resources/layouts/comatose_admin_template.html.erb +28 -0
- data/resources/public/images/collapsed.gif +0 -0
- data/resources/public/images/expanded.gif +0 -0
- data/resources/public/images/no-children.gif +0 -0
- data/resources/public/images/page.gif +0 -0
- data/resources/public/images/spinner.gif +0 -0
- data/resources/public/images/title-hover-bg.gif +0 -0
- data/resources/public/javascripts/comatose_admin.js +401 -0
- data/resources/public/stylesheets/comatose_admin.css +404 -0
- data/tasks/comatose.rake +9 -0
- data/test/behaviors.rb +106 -0
- data/test/fixtures/comatose_pages.yml +96 -0
- data/test/functional/comatose_admin_controller_test.rb +114 -0
- data/test/functional/comatose_controller_test.rb +44 -0
- data/test/javascripts/test.html +26 -0
- data/test/javascripts/test_runner.js +307 -0
- data/test/test_helper.rb +55 -0
- data/test/unit/class_options_test.rb +52 -0
- data/test/unit/comatose_page_test.rb +136 -0
- data/test/unit/processing_context_test.rb +108 -0
- data/test/unit/text_filters_test.rb +52 -0
- data/views/comatose_admin/_form.html.erb +96 -0
- data/views/comatose_admin/_page_list_item.html.erb +60 -0
- data/views/comatose_admin/delete.html.erb +18 -0
- data/views/comatose_admin/edit.html.erb +5 -0
- data/views/comatose_admin/index.html.erb +29 -0
- data/views/comatose_admin/new.html.erb +5 -0
- data/views/comatose_admin/reorder.html.erb +30 -0
- data/views/comatose_admin/versions.html.erb +40 -0
- data/views/layouts/comatose_admin.html.erb +837 -0
- data/views/layouts/comatose_admin_customize.html.erb +28 -0
- data/views/layouts/comatose_content.html.erb +17 -0
- metadata +148 -0
@@ -0,0 +1,44 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
2
|
+
require 'comatose_controller'
|
3
|
+
require 'comatose_helper'
|
4
|
+
|
5
|
+
# Re-raise errors caught by the controller.
|
6
|
+
class ComatoseController
|
7
|
+
def rescue_action(e) raise e end
|
8
|
+
end
|
9
|
+
|
10
|
+
|
11
|
+
class ComatoseControllerTest < Test::Unit::TestCase
|
12
|
+
|
13
|
+
fixtures :comatose_pages
|
14
|
+
|
15
|
+
def setup
|
16
|
+
@controller = ComatoseController.new
|
17
|
+
@request = ActionController::TestRequest.new
|
18
|
+
@response = ActionController::TestResponse.new
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_truth
|
22
|
+
assert true
|
23
|
+
end
|
24
|
+
|
25
|
+
should "show pages based on path_info" do
|
26
|
+
|
27
|
+
# Get the faq page...
|
28
|
+
get :show, :page=>'faq', :index=>'', :layout=>'comatose_content.html.erb', :use_cache=>'false'
|
29
|
+
assert_response :success
|
30
|
+
assert_tag :tag=>'h1', :child=>/Frequently Asked Questions/
|
31
|
+
|
32
|
+
# Get a question page using rails 2.0 array style...
|
33
|
+
get :show, :page=>['faq','question-one'], :index=>'', :layout=>'comatose_content.html.erb', :use_cache=>'false'
|
34
|
+
assert_response :success
|
35
|
+
assert_tag :tag=>'title', :child=>/Question/
|
36
|
+
|
37
|
+
# Get a question page using rails 1.x path style...
|
38
|
+
get :show, :page=>ActionController::Routing::PathSegment::Result.new_escaped(['faq','question-one']),
|
39
|
+
:index=>'', :layout=>'comatose_content.html.erb', :use_cache=>'false'
|
40
|
+
assert_response :success
|
41
|
+
assert_tag :tag=>'title', :child=>/Question/
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
<html>
|
2
|
+
<!-- Required Scripts -->
|
3
|
+
<script src="../../../../../public/javascripts/prototype.js" type="text/javascript"></script>
|
4
|
+
<script src="../../../../../public/javascripts/effects.js" type="text/javascript"></script>
|
5
|
+
<script src="../../../../../public/javascripts/dragdrop.js" type="text/javascript"></script>
|
6
|
+
<script src="../../../../../public/javascripts/controls.js" type="text/javascript"></script>
|
7
|
+
<script src="../../resources/public/javascripts/comatose_admin.js"></script>
|
8
|
+
<!-- Unit Tests -->
|
9
|
+
|
10
|
+
<script>
|
11
|
+
var Tests = {
|
12
|
+
title: "Comatose JS Tests",
|
13
|
+
// description: "Methods that start with testFail test that assertions fail property.",
|
14
|
+
|
15
|
+
test_String_toSlug: function() {
|
16
|
+
assertEqual( 'hello-how-are-you', 'Hello, How Are You?'.toSlug() );
|
17
|
+
assertEqual( 'i-have-too-much-space', 'I have too much space'.toSlug() );
|
18
|
+
assertEqual( 'what-about-dashes', 'What about - dashes?'.toSlug() );
|
19
|
+
assertEqual( 'a-bizarre-title', 'A !@!@#$%^&*()_+{} Bizarre TiTle!'.toSlug() );
|
20
|
+
assertEqual( '001-numbers-too', '001 Numbers too'.toSlug() );
|
21
|
+
}
|
22
|
+
}
|
23
|
+
</script>
|
24
|
+
<!-- UnitTestRunner -->
|
25
|
+
<script src="test_runner.js"></script>
|
26
|
+
</html>
|
@@ -0,0 +1,307 @@
|
|
1
|
+
/*
|
2
|
+
= Test Framework
|
3
|
+
version 1.0
|
4
|
+
created by M@ McCray (http://www.mattmccray.com)
|
5
|
+
|
6
|
+
This is a simple JavaScript test framework.
|
7
|
+
|
8
|
+
= TODO:
|
9
|
+
|
10
|
+
* Add support for calling Tests.setup() and Tests.teardown()
|
11
|
+
* Documentation!
|
12
|
+
* Add support for methods that don't start with 'test'?
|
13
|
+
* Make test method names more English?
|
14
|
+
*/
|
15
|
+
|
16
|
+
// We're gonna run all this in it's own scope so it doesn't pollute the test namespace
|
17
|
+
(function(){
|
18
|
+
var HTML = {
|
19
|
+
_all_tags: ['a','abbr','acronym','address','area','b','base','bdo','big','blockquote','body','br','button','caption','cite','code','col','colgroup','dd','del','dfn','div','dl','DOCTYPE','dt','em','fieldset','form','h1','h2','h3','h4','h5','h6','head','html','hr','i','img','input','ins','kbd','label','legend','li','link','map','meta','noscript','object','ol','optgroup','option','p','param','pre','q','samp','script','select','small','span','strong','style','sub','sup','table','tbody','td','textarea','tfoot','th','thead','title','tr','tt','ul'],
|
20
|
+
_init: function() {
|
21
|
+
for(var $i=0; $i<this._all_tags.length; $i++) {
|
22
|
+
var $tag = this._all_tags[$i]
|
23
|
+
eval( 'HTML.'+ $tag +' = function (){ return HTML._write_tag("'+ $tag +'", arguments); }' );
|
24
|
+
//this[$tag] = new Function("return HTML._write_tag('"+ $tag +"', arguments);")
|
25
|
+
this.namespace += ';var '+ $tag +' = HTML.'+ $tag;
|
26
|
+
}
|
27
|
+
},
|
28
|
+
_write_tag: function(tag, options) {
|
29
|
+
var $content = ''; var $atts = "";
|
30
|
+
for(var $i=0; $i<options.length; $i++) {
|
31
|
+
var $arg = options[$i];
|
32
|
+
if (typeof($arg) == 'string' || typeof($arg) == 'number')
|
33
|
+
$content += $arg.toString();
|
34
|
+
else if (typeof($arg) == 'function')
|
35
|
+
$content += $arg();
|
36
|
+
else if ( $arg instanceof Object)
|
37
|
+
for($prop in $arg) $atts += ' '+ $prop +'="'+ $arg[$prop] +'"';
|
38
|
+
}
|
39
|
+
if($content == '')
|
40
|
+
return '<'+ tag + $atts +'/>';
|
41
|
+
else
|
42
|
+
return '<'+ tag + $atts +'>'+ $content +'</'+ tag +'>';
|
43
|
+
},
|
44
|
+
namespace: 'var text = HTML.text',
|
45
|
+
toString: function() { return this.namespace; },
|
46
|
+
text: function() {
|
47
|
+
var $content='';
|
48
|
+
for(var $i=0; $i<arguments.length; $i++) $content += arguments[$i].toString();
|
49
|
+
return $content;
|
50
|
+
}
|
51
|
+
};
|
52
|
+
HTML._init();
|
53
|
+
eval(HTML.namespace);
|
54
|
+
|
55
|
+
var list_html = "";
|
56
|
+
var page_title = "Test Cases";
|
57
|
+
var page_desc = "";
|
58
|
+
|
59
|
+
window.methodList = [];
|
60
|
+
if( typeof(Tests) != 'undefined' ) {
|
61
|
+
if(Tests.title) page_title = Tests.title;
|
62
|
+
if(Tests.description) page_desc = Tests.description;
|
63
|
+
|
64
|
+
for(func in Tests) {
|
65
|
+
if(/test/.test(func)) {
|
66
|
+
methodList.push(func);
|
67
|
+
list_html += li ({id:func, 'class':'untested'},
|
68
|
+
span (func.toString()),
|
69
|
+
div (' ', {id: (func +'-error')})
|
70
|
+
)
|
71
|
+
}
|
72
|
+
}
|
73
|
+
} else {
|
74
|
+
list_html = li('No tests defined!', {'class':'fail'})
|
75
|
+
}
|
76
|
+
|
77
|
+
// Generate HTML
|
78
|
+
|
79
|
+
if( page_desc != '' ) page_desc = p( page_desc,{'class':'description'});
|
80
|
+
|
81
|
+
document.write(
|
82
|
+
head (
|
83
|
+
title ( "(", page_title, ")", " :: JavaScript Test Framework" ),
|
84
|
+
style (
|
85
|
+
"BODY { font-family:Helvetica,Verdana,Sans-Serif; background:#E0E0E0; }",
|
86
|
+
"LI { padding:3px; }",
|
87
|
+
"H1 { margin-top:0; color:navy; }",
|
88
|
+
"INPUT { font-size:105%; font-weight:bold; }",
|
89
|
+
"#main { width:650px; margin:0 auto; background:#FFF; padding:20px; border:1px solid #BBB; }",
|
90
|
+
"#status { padding:10px; }",
|
91
|
+
"#sidebar { background:#F0F0F0; float:right; width:200px; padding:5px 15px; font-size:85%; border:10px solid white; border-top:0px; }",
|
92
|
+
".description { background:#FFC; padding:10px; font-size:85%; }",
|
93
|
+
".credit { padding:0px 2px; font-size:90%; color:gray; }",
|
94
|
+
".untested { color:#C5C5C5; }",
|
95
|
+
".untested SPAN { color:black; }",
|
96
|
+
".pass { color:#0F0; }",
|
97
|
+
".pass SPAN { color:#363; }",
|
98
|
+
".fail { color:red; }",
|
99
|
+
".fail DIV { font-size:85%; color:#666; }",
|
100
|
+
".fail SPAN { color:maroon; }",
|
101
|
+
".fail UL { margin:0px; padding:0px; padding-left:10px; list-style:none; }",
|
102
|
+
".fail LI { padding:2px; }",
|
103
|
+
".assertion-type { color:black !important; font-weight:bold; }",
|
104
|
+
".exception-type { color:red !important; font-weight:bold; }"
|
105
|
+
)
|
106
|
+
),
|
107
|
+
body (
|
108
|
+
div ({id:'main'},
|
109
|
+
div ({id:'sidebar'},
|
110
|
+
p ("This is a simple JavaScript test framework."),
|
111
|
+
p ("To read the tests, just view-source."),
|
112
|
+
p ("Created by M@ McCray. Released under the MIT license.", {'class':'credit'})
|
113
|
+
),
|
114
|
+
h1 (page_title),
|
115
|
+
page_desc,
|
116
|
+
ul ({id:'test-list'},
|
117
|
+
list_html
|
118
|
+
),
|
119
|
+
table( tr(
|
120
|
+
td(
|
121
|
+
input ({ type:'button', onclick:'runAllTests()', value:'Run All Tests'})
|
122
|
+
),
|
123
|
+
td(
|
124
|
+
div (' ',{id:'status'})
|
125
|
+
)
|
126
|
+
))
|
127
|
+
),
|
128
|
+
div (' ', {id:'work-area'})
|
129
|
+
)
|
130
|
+
);
|
131
|
+
|
132
|
+
window.assertionCount = 0;
|
133
|
+
window.assertionFailCount = 0;
|
134
|
+
window.assertionErrorCount = 0;
|
135
|
+
|
136
|
+
var assertionFailures = [];
|
137
|
+
|
138
|
+
// Exported functions
|
139
|
+
window.runAllTests = function() {
|
140
|
+
var errors = [];
|
141
|
+
assertionCount = 0;
|
142
|
+
assertionFailCount = 0;
|
143
|
+
|
144
|
+
forEach(methodList, function(func){
|
145
|
+
setStatus('Evaluating '+ func +'...');
|
146
|
+
|
147
|
+
assertionFailures = [];
|
148
|
+
assertionExceptions = [];
|
149
|
+
try {
|
150
|
+
Tests[func]()
|
151
|
+
} catch (ex) {
|
152
|
+
assertionErrorCount++;
|
153
|
+
assertionExceptions.push(ex)
|
154
|
+
}
|
155
|
+
if( assertionFailures.length == 0 && assertionExceptions.length == 0) {
|
156
|
+
$(func).className = 'pass';
|
157
|
+
} else {
|
158
|
+
$(func).className = 'fail';
|
159
|
+
var results = ""
|
160
|
+
|
161
|
+
forEach(assertionFailures, function(err){
|
162
|
+
results += li (
|
163
|
+
span (err.assertionType, {'class':'assertion-type'}), ': ',
|
164
|
+
(err.message || err.extraInformation)
|
165
|
+
);
|
166
|
+
});
|
167
|
+
|
168
|
+
forEach(assertionExceptions, function(err){
|
169
|
+
results += li (
|
170
|
+
span ('Error', {'class':'exception-type'}), ': ',
|
171
|
+
(err.description || err.message || err)
|
172
|
+
);
|
173
|
+
});
|
174
|
+
|
175
|
+
setResults( func, ul (results) )
|
176
|
+
}
|
177
|
+
});
|
178
|
+
|
179
|
+
setStatus( div (
|
180
|
+
assertionCount,
|
181
|
+
" assertions, ",
|
182
|
+
span ((assertionCount - assertionFailCount), {'class':'pass'}),
|
183
|
+
" passed",
|
184
|
+
show_if (assertionFailCount, text( ", ",
|
185
|
+
span (assertionFailCount, {'class':'fail'}),
|
186
|
+
" failed" )
|
187
|
+
),
|
188
|
+
show_if (assertionErrorCount, text( ", ",
|
189
|
+
span (assertionErrorCount, {'class':'fail'}),
|
190
|
+
" error(s)")
|
191
|
+
),
|
192
|
+
"."
|
193
|
+
));
|
194
|
+
}
|
195
|
+
|
196
|
+
// Assertions
|
197
|
+
window.assert = function(condition, msg) {
|
198
|
+
window.assertionCount++;
|
199
|
+
if(!condition) {
|
200
|
+
ex = 'true was expected, but value was '+ condition;
|
201
|
+
assertError(msg, 'assert', ex);
|
202
|
+
}
|
203
|
+
}
|
204
|
+
|
205
|
+
window.assertFalse = function(condition, msg) {
|
206
|
+
window.assertionCount++;
|
207
|
+
if(condition) {
|
208
|
+
ex = 'false was expected, but value was '+ condition;
|
209
|
+
assertError(msg, 'assertFalse', ex);
|
210
|
+
}
|
211
|
+
}
|
212
|
+
|
213
|
+
window.assertNull = function(condition, msg) {
|
214
|
+
window.assertionCount++;
|
215
|
+
if(null != condition) {
|
216
|
+
ex = 'null was expected, but value was '+ condition;
|
217
|
+
assertError(msg, 'assertNull', ex);
|
218
|
+
}
|
219
|
+
}
|
220
|
+
|
221
|
+
window.assertNotNull = function(condition, msg) {
|
222
|
+
window.assertionCount++;
|
223
|
+
if(null == condition) {
|
224
|
+
ex = 'null was not expected, but value was '+ condition;
|
225
|
+
assertError(msg, 'assertNotNull', ex);
|
226
|
+
}
|
227
|
+
}
|
228
|
+
|
229
|
+
window.assertEqual = function(condition1, condition2, msg) {
|
230
|
+
window.assertionCount++;
|
231
|
+
ex = condition1 +' was expected, but value was '+ condition2;
|
232
|
+
if(condition1 != condition2) {
|
233
|
+
assertError(msg, 'assertEqual', ex);
|
234
|
+
}
|
235
|
+
}
|
236
|
+
|
237
|
+
window.assertNotEqual = function(condition1, condition2, msg) {
|
238
|
+
window.assertionCount++;
|
239
|
+
if(condition1 == condition2) {
|
240
|
+
ex = condition1 +' was not expected, but value was '+ condition2;
|
241
|
+
assertError(msg, 'assertNotEqual', ex);
|
242
|
+
}
|
243
|
+
}
|
244
|
+
|
245
|
+
window.assertUndefined = function(object, msg) {
|
246
|
+
window.assertionCount++;
|
247
|
+
if(object != 'undefined' ) {
|
248
|
+
ex = object +' was defined';
|
249
|
+
assertError(msg, 'assertUndefined', ex);
|
250
|
+
}
|
251
|
+
}
|
252
|
+
|
253
|
+
window.assertDefined = function(object, msg) {
|
254
|
+
window.assertionCount++;
|
255
|
+
if(object == 'undefined' ) {
|
256
|
+
ex = object +' was undefined';
|
257
|
+
assertError(msg, 'assertDefined', ex);
|
258
|
+
}
|
259
|
+
}
|
260
|
+
|
261
|
+
// Private functions
|
262
|
+
function $(elem) {
|
263
|
+
return document.getElementById(elem);
|
264
|
+
}
|
265
|
+
|
266
|
+
function log() {
|
267
|
+
var msg = [];
|
268
|
+
forEach(arguments, function(arg){ msg.push( arg || '' ); });
|
269
|
+
if(window.console && window.console.log) {
|
270
|
+
window.console.log(msg.join(' '))
|
271
|
+
} else if(window.console && window.console.info) {
|
272
|
+
window.console.info(msg.join(' '))
|
273
|
+
}
|
274
|
+
}
|
275
|
+
|
276
|
+
function forEach(array, block, context) {
|
277
|
+
for (var i = 0; i < array.length; i++) {
|
278
|
+
block.call(context, array[i], i, array);
|
279
|
+
}
|
280
|
+
}
|
281
|
+
|
282
|
+
function show_if(list, html) {
|
283
|
+
if(list > 0)
|
284
|
+
return html;
|
285
|
+
else
|
286
|
+
return '';
|
287
|
+
}
|
288
|
+
|
289
|
+
function setStatus(msg) {
|
290
|
+
$('status').innerHTML = msg;
|
291
|
+
}
|
292
|
+
|
293
|
+
function setResults(func, msg) {
|
294
|
+
$(func+'-error').innerHTML = msg;
|
295
|
+
}
|
296
|
+
|
297
|
+
function assertError(errorMessage, assertionType, extraInfo) {
|
298
|
+
window.assertionFailCount++;
|
299
|
+
assertionFailures.push({
|
300
|
+
assertionType: assertionType,
|
301
|
+
message: errorMessage,
|
302
|
+
extraInformation: extraInfo.toString().replace(/</g, '<'),
|
303
|
+
description: errorMessage +"\n"+ extraInfo.toString().replace(/</g, '<')
|
304
|
+
});
|
305
|
+
}
|
306
|
+
|
307
|
+
})();
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
ENV["RAILS_ENV"] = 'test'
|
2
|
+
|
3
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '../../../../config/environment.rb'))
|
4
|
+
|
5
|
+
require 'test/unit'
|
6
|
+
require 'test_help'
|
7
|
+
|
8
|
+
class Test::Unit::TestCase
|
9
|
+
|
10
|
+
self.fixture_path = File.expand_path( File.join(File.dirname(__FILE__), 'fixtures') )
|
11
|
+
|
12
|
+
self.use_transactional_fixtures = true
|
13
|
+
self.use_instantiated_fixtures = false
|
14
|
+
|
15
|
+
def setup
|
16
|
+
Comatose.configure do |config|
|
17
|
+
config.default_filter = :textile
|
18
|
+
config.default_processor = :liquid
|
19
|
+
config.authorization = Proc.new { true }
|
20
|
+
config.admin_authorization = Proc.new { true }
|
21
|
+
config.admin_get_author = Proc.new { request.env['REMOTE_ADDR'] }
|
22
|
+
config.admin_get_root_page = Proc.new { ComatosePage.root }
|
23
|
+
end
|
24
|
+
TextFilters.default_filter = "Textile"
|
25
|
+
end
|
26
|
+
|
27
|
+
def create_page(options={})
|
28
|
+
ComatosePage.create({ :title => 'Comatose Page', :author=>'test', :parent_id=>1 }.merge(options))
|
29
|
+
end
|
30
|
+
|
31
|
+
def comatose_page(sym)
|
32
|
+
ComatosePage.find_by_slug(sym.to_s.dasherize)
|
33
|
+
end
|
34
|
+
|
35
|
+
def assert_difference(object, method = nil, difference = 1)
|
36
|
+
initial_value = object.send(method)
|
37
|
+
yield
|
38
|
+
assert_equal initial_value + difference, object.send(method), "#{object}##{method}"
|
39
|
+
end
|
40
|
+
|
41
|
+
def assert_no_difference(object, method, &block)
|
42
|
+
assert_difference object, method, 0, &block
|
43
|
+
end
|
44
|
+
|
45
|
+
class << self
|
46
|
+
def should(behave,&block)
|
47
|
+
method_name = "test_should_#{behave.gsub(' ', '_')}"
|
48
|
+
if block
|
49
|
+
define_method method_name, &block
|
50
|
+
else
|
51
|
+
puts ">>> Untested: #{name.sub(/Test$/,'')} should #{behave}"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
2
|
+
require 'support/class_options'
|
3
|
+
|
4
|
+
class ClassOptionsTest < Test::Unit::TestCase
|
5
|
+
|
6
|
+
class Opts
|
7
|
+
define_option :nothing, nil
|
8
|
+
define_option :nada
|
9
|
+
define_option :name, "Matt"
|
10
|
+
define_option :age, 30
|
11
|
+
define_option :mode, :test
|
12
|
+
define_option :listing, ['one', 'two', 'three']
|
13
|
+
define_option :opts_1, {'one'=>'ONE', 'two'=>'TWO'}
|
14
|
+
define_option :opts_2, {:one=>'ONE', :two=>'TWO'}
|
15
|
+
define_option :should_work, true
|
16
|
+
define_option :would_surprise, false
|
17
|
+
end
|
18
|
+
|
19
|
+
should "allow nil as a default" do
|
20
|
+
assert_equal nil, Opts.nothing
|
21
|
+
assert_equal nil, Opts.nada
|
22
|
+
end
|
23
|
+
|
24
|
+
should "allow boolean defaults" do
|
25
|
+
assert_equal true, Opts.should_work
|
26
|
+
assert_equal false, Opts.would_surprise
|
27
|
+
end
|
28
|
+
|
29
|
+
should "allow string defaults" do
|
30
|
+
assert_equal 'Matt', Opts.name
|
31
|
+
end
|
32
|
+
|
33
|
+
should "allow numeric defaults" do
|
34
|
+
assert_equal 30, Opts.age
|
35
|
+
end
|
36
|
+
|
37
|
+
should "allow symbolic defaults" do
|
38
|
+
assert_equal :test, Opts.mode
|
39
|
+
end
|
40
|
+
|
41
|
+
should "allow array literals as defaults" do
|
42
|
+
assert_equal ['one', 'two', 'three'], Opts.listing
|
43
|
+
end
|
44
|
+
|
45
|
+
should "allow hash literals as defaults" do
|
46
|
+
h1 = {'one'=>'ONE', 'two'=>'TWO'}
|
47
|
+
h2 = {:one=>'ONE', :two=>'TWO'}
|
48
|
+
assert_equal h1, Opts.opts_1
|
49
|
+
assert_equal h2, Opts.opts_2
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
@@ -0,0 +1,136 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
2
|
+
|
3
|
+
class ComatosePageTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
fixtures :comatose_pages
|
6
|
+
|
7
|
+
should "create page" do
|
8
|
+
assert_difference ComatosePage, :count do
|
9
|
+
page = create_page :title=>'New Page Name'
|
10
|
+
assert !page.new_record?, "#{page.errors.full_messages.to_sentence}"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
should "create a new version of an updated page" do
|
15
|
+
page = create_page
|
16
|
+
assert_difference page, :version do
|
17
|
+
page.update_attribute :body, "I'm the new content!"
|
18
|
+
assert_equal "<p>I’m the new content!</p>", page.to_html
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
should "render content through textile and liquid processors" do
|
23
|
+
page = create_page :title=>'Title Here', :body=>'h1. {{page.title}}'
|
24
|
+
assert_equal "<h1>Title Here</h1>", page.to_html
|
25
|
+
end
|
26
|
+
|
27
|
+
should "not allow creation of page when missing a title" do
|
28
|
+
assert_no_difference ComatosePage, :count do
|
29
|
+
p = create_page(:title => nil)
|
30
|
+
assert p.errors.on(:title)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
should "have good fixtures for this to work out" do
|
35
|
+
assert_equal 'Home Page', root_page.title
|
36
|
+
assert_equal 'home-page', root_page.slug
|
37
|
+
assert_equal 'Comatose', root_page.author
|
38
|
+
assert_equal "", root_page.full_path
|
39
|
+
assert_equal 'faq', faq_page.full_path
|
40
|
+
end
|
41
|
+
|
42
|
+
should "generate slugs correctly" do
|
43
|
+
assert_equal 'hello-how-are-you', new_page_slug( "Hello, How Are You?" )
|
44
|
+
assert_equal 'i-have-too-much-space', new_page_slug( "I have too much space" )
|
45
|
+
assert_equal 'i-have-leading-and-trailing-space', new_page_slug( " I have leading and trailing space " )
|
46
|
+
assert_equal 'what-about-dashes', new_page_slug( "What about - dashes?" )
|
47
|
+
assert_equal 'a-bizarre-title', new_page_slug( 'A !@!@#$%^<>&*()_+{} Bizarre TiTle!' )
|
48
|
+
assert_equal '001-numbers-too', new_page_slug( "001 Numbers too" )
|
49
|
+
end
|
50
|
+
|
51
|
+
should "generate page paths correctly" do
|
52
|
+
products = root_page.children.create( :title=>'Products' )
|
53
|
+
assert_equal 'products', products.full_path
|
54
|
+
|
55
|
+
books = products.children.create( :title=>'Books' )
|
56
|
+
assert_equal 'products/books', books.full_path
|
57
|
+
|
58
|
+
novels = books.children.create( :title=>'Novels' )
|
59
|
+
assert_equal 'products/books/novels', novels.full_path
|
60
|
+
|
61
|
+
comics = books.children.create( :title=>'Comics' )
|
62
|
+
assert_equal 'products/books/comics', comics.full_path
|
63
|
+
end
|
64
|
+
|
65
|
+
should "update page paths when pages are moved" do
|
66
|
+
page = comatose_page :params
|
67
|
+
assert_equal 'params', page.full_path
|
68
|
+
|
69
|
+
q1pg = comatose_page :question_one
|
70
|
+
page.parent_id = q1pg.id
|
71
|
+
assert page.save, "Page.save"
|
72
|
+
|
73
|
+
page.reload
|
74
|
+
assert_equal 'faq/question-one/params', page.full_path
|
75
|
+
|
76
|
+
q1pg.reload
|
77
|
+
q1pg.slug = "q-1"
|
78
|
+
assert q1pg.save, "Page.save"
|
79
|
+
assert_equal "faq/q-1", q1pg.full_path
|
80
|
+
|
81
|
+
page.reload
|
82
|
+
assert_equal 'faq/q-1/params', page.full_path
|
83
|
+
end
|
84
|
+
|
85
|
+
should "set an AR error with processor syntax error info" do
|
86
|
+
page = create_page :title=>'Title Here', :body=>'h1. {% crap %}'
|
87
|
+
assert !page.save, page.errors.full_messages.to_sentence
|
88
|
+
end
|
89
|
+
|
90
|
+
should "render body text accurately" do
|
91
|
+
assert_equal "<h1>Home Page</h1>\n<p>This is your <strong>home page</strong>.</p>", root_page.to_html
|
92
|
+
assert_equal "<h1>Frequently Asked Questions</h1>\n<h2><a href=\"/faq/question-one\">Question One?</a></h2>\n<p>Content for <strong>question one</strong>.</p>\n<h2><a href=\"/faq/question-two\">Question Two?</a></h2>\n<p>Content for <strong>question two</strong>.</p>", faq_page.to_html
|
93
|
+
end
|
94
|
+
|
95
|
+
should "render data from parameterized calls too" do
|
96
|
+
assert_equal "<p>I’m</p>", param_driven_page.to_html
|
97
|
+
assert_equal "<p>I’m From the Params Hash</p>", param_driven_page.to_html(:extra=>'From the Params Hash')
|
98
|
+
end
|
99
|
+
|
100
|
+
should "render data from a Drop" do
|
101
|
+
Comatose.define_drop "app" do
|
102
|
+
def test
|
103
|
+
"From Drop"
|
104
|
+
end
|
105
|
+
end
|
106
|
+
p = create_page(:title=>'Test Drop', :body=>'{{ app.test }}')
|
107
|
+
assert_equal "<p>From Drop</p>", p.to_html
|
108
|
+
end
|
109
|
+
|
110
|
+
# Test illustrates broken partial, sort of
|
111
|
+
# <%= render :comatose => 'faq/question-one' %> should work, but does not
|
112
|
+
should "render inline partial" do
|
113
|
+
Comatose.config.default_processor = :erb
|
114
|
+
page = create_page :body => "Included: <%= ComatosePage.find_by_path('faq/question-one').to_html %>", :filter_type => :none
|
115
|
+
assert_equal "Included: <p>Content for <strong>question one</strong>.</p>", page.to_html
|
116
|
+
end
|
117
|
+
|
118
|
+
protected
|
119
|
+
|
120
|
+
def new_page_slug(title)
|
121
|
+
create_page( :title=>title ).slug
|
122
|
+
end
|
123
|
+
|
124
|
+
def root_page
|
125
|
+
ComatosePage.root
|
126
|
+
end
|
127
|
+
|
128
|
+
def faq_page
|
129
|
+
comatose_page :faq
|
130
|
+
end
|
131
|
+
|
132
|
+
def param_driven_page
|
133
|
+
comatose_page :params
|
134
|
+
end
|
135
|
+
|
136
|
+
end
|