2014-07-28 16:40:06 -04:00
module ( "Discourse.Composer" , {
setup : function ( ) {
sinon . stub ( Discourse . User , 'currentProp' ) . withArgs ( 'admin' ) . returns ( false ) ;
} ,
teardown : function ( ) {
Discourse . User . currentProp . restore ( ) ;
}
} ) ;
2013-06-17 11:38:30 -04:00
test ( 'replyLength' , function ( ) {
2013-12-30 13:29:52 -05:00
var replyLength = function ( val , expectedLength ) {
2013-06-17 11:38:30 -04:00
var composer = Discourse . Composer . create ( { reply : val } ) ;
equal ( composer . get ( 'replyLength' ) , expectedLength ) ;
} ;
replyLength ( "basic reply" , 11 , "basic reply length" ) ;
replyLength ( " \nbasic reply\t" , 11 , "trims whitespaces" ) ;
replyLength ( "ba sic\n\nreply" , 12 , "count only significant whitespaces" ) ;
replyLength ( "1[quote=]not counted[/quote]2[quote=]at all[/quote]3" , 3 , "removes quotes" ) ;
replyLength ( "1[quote=]not[quote=]counted[/quote]yay[/quote]2" , 2 , "handles nested quotes correctly" ) ;
2013-06-20 12:33:21 -04:00
} ) ;
test ( 'missingReplyCharacters' , function ( ) {
var missingReplyCharacters = function ( val , isPM , expected , message ) {
var composer = Discourse . Composer . create ( { reply : val , creatingPrivateMessage : isPM } ) ;
equal ( composer . get ( 'missingReplyCharacters' ) , expected , message ) ;
2013-06-21 14:06:20 -04:00
} ;
2013-06-20 12:33:21 -04:00
missingReplyCharacters ( 'hi' , false , Discourse . SiteSettings . min _post _length - 2 , 'too short public post' ) ;
missingReplyCharacters ( 'hi' , true , Discourse . SiteSettings . min _private _message _post _length - 2 , 'too short private message' ) ;
} ) ;
test ( 'missingTitleCharacters' , function ( ) {
var missingTitleCharacters = function ( val , isPM , expected , message ) {
var composer = Discourse . Composer . create ( { title : val , creatingPrivateMessage : isPM } ) ;
equal ( composer . get ( 'missingTitleCharacters' ) , expected , message ) ;
2013-06-21 14:06:20 -04:00
} ;
2013-06-20 12:33:21 -04:00
missingTitleCharacters ( 'hi' , false , Discourse . SiteSettings . min _topic _title _length - 2 , 'too short post title' ) ;
missingTitleCharacters ( 'z' , true , Discourse . SiteSettings . min _private _message _title _length - 1 , 'too short pm title' ) ;
2013-07-04 13:35:15 -04:00
} ) ;
2013-07-05 11:53:09 -04:00
test ( 'replyDirty' , function ( ) {
2013-07-04 13:35:15 -04:00
var composer = Discourse . Composer . create ( ) ;
2013-07-05 11:53:09 -04:00
ok ( ! composer . get ( 'replyDirty' ) , "by default it's false" ) ;
2013-07-04 13:35:15 -04:00
composer . setProperties ( {
originalText : "hello" ,
reply : "hello"
} ) ;
2013-07-05 11:53:09 -04:00
ok ( ! composer . get ( 'replyDirty' ) , "it's false when the originalText is the same as the reply" ) ;
2013-07-04 13:35:15 -04:00
composer . set ( 'reply' , 'hello world' ) ;
2013-07-05 11:53:09 -04:00
ok ( composer . get ( 'replyDirty' ) , "it's true when the reply changes" ) ;
} ) ;
test ( "appendText" , function ( ) {
var composer = Discourse . Composer . create ( ) ;
blank ( composer . get ( 'reply' ) , "the reply is blank by default" ) ;
composer . appendText ( "hello" ) ;
equal ( composer . get ( 'reply' ) , "hello" , "it appends text to nothing" ) ;
composer . appendText ( " world" ) ;
equal ( composer . get ( 'reply' ) , "hello world" , "it appends text to existing text" ) ;
2014-06-18 15:17:32 +10:00
composer . clearState ( ) ;
composer . appendText ( "a\n\n\n\nb" ) ;
composer . appendText ( "c" , 3 , { block : true } ) ;
equal ( composer . get ( "reply" ) , "a\n\nc\n\nb" ) ;
composer . clearState ( ) ;
composer . appendText ( "ab" ) ;
composer . appendText ( "c" , 1 , { block : true } ) ;
equal ( composer . get ( "reply" ) , "a\n\nc\n\nb" ) ;
composer . clearState ( ) ;
composer . appendText ( "\nab" ) ;
composer . appendText ( "c" , 0 , { block : true } ) ;
equal ( composer . get ( "reply" ) , "c\n\nab" ) ;
2013-07-04 13:35:15 -04:00
} ) ;
2013-07-05 11:53:09 -04:00
test ( "Title length for regular topics" , function ( ) {
Discourse . SiteSettings . min _topic _title _length = 5 ;
Discourse . SiteSettings . max _topic _title _length = 10 ;
var composer = Discourse . Composer . create ( ) ;
composer . set ( 'title' , 'asdf' ) ;
ok ( ! composer . get ( 'titleLengthValid' ) , "short titles are not valid" ) ;
composer . set ( 'title' , 'this is a long title' ) ;
ok ( ! composer . get ( 'titleLengthValid' ) , "long titles are not valid" ) ;
composer . set ( 'title' , 'just right' ) ;
ok ( composer . get ( 'titleLengthValid' ) , "in the range is okay" ) ;
} ) ;
test ( "Title length for private messages" , function ( ) {
Discourse . SiteSettings . min _private _message _title _length = 5 ;
Discourse . SiteSettings . max _topic _title _length = 10 ;
var composer = Discourse . Composer . create ( { action : Discourse . Composer . PRIVATE _MESSAGE } ) ;
composer . set ( 'title' , 'asdf' ) ;
ok ( ! composer . get ( 'titleLengthValid' ) , "short titles are not valid" ) ;
2013-07-04 13:35:15 -04:00
2013-07-05 11:53:09 -04:00
composer . set ( 'title' , 'this is a long title' ) ;
ok ( ! composer . get ( 'titleLengthValid' ) , "long titles are not valid" ) ;
composer . set ( 'title' , 'just right' ) ;
ok ( composer . get ( 'titleLengthValid' ) , "in the range is okay" ) ;
} ) ;
test ( "Title length for private messages" , function ( ) {
Discourse . SiteSettings . min _private _message _title _length = 5 ;
Discourse . SiteSettings . max _topic _title _length = 10 ;
var composer = Discourse . Composer . create ( { action : Discourse . Composer . PRIVATE _MESSAGE } ) ;
composer . set ( 'title' , 'asdf' ) ;
ok ( ! composer . get ( 'titleLengthValid' ) , "short titles are not valid" ) ;
composer . set ( 'title' , 'this is a long title' ) ;
ok ( ! composer . get ( 'titleLengthValid' ) , "long titles are not valid" ) ;
composer . set ( 'title' , 'just right' ) ;
ok ( composer . get ( 'titleLengthValid' ) , "in the range is okay" ) ;
} ) ;
2013-07-04 13:35:15 -04:00
test ( 'importQuote with no data' , function ( ) {
this . stub ( Discourse . Post , 'load' ) ;
var composer = Discourse . Composer . create ( ) ;
composer . importQuote ( ) ;
blank ( composer . get ( 'reply' ) , 'importing with no topic adds nothing' ) ;
ok ( ! Discourse . Post . load . calledOnce , "load is not called" ) ;
composer = Discourse . Composer . create ( { topic : Discourse . Topic . create ( ) } ) ;
composer . importQuote ( ) ;
blank ( composer . get ( 'reply' ) , 'importing with no posts in a topic adds nothing' ) ;
ok ( ! Discourse . Post . load . calledOnce , "load is not called" ) ;
} ) ;
2013-07-05 11:53:09 -04:00
test ( 'editingFirstPost' , function ( ) {
var composer = Discourse . Composer . create ( ) ;
ok ( ! composer . get ( 'editingFirstPost' ) , "it's false by default" ) ;
var post = Discourse . Post . create ( { id : 123 , post _number : 2 } ) ;
composer . setProperties ( { post : post , action : Discourse . Composer . EDIT } ) ;
ok ( ! composer . get ( 'editingFirstPost' ) , "it's false when not editing the first post" ) ;
post . set ( 'post_number' , 1 ) ;
ok ( composer . get ( 'editingFirstPost' ) , "it's true when editing the first post" ) ;
} ) ;
2013-07-15 19:47:13 -04:00
asyncTestDiscourse ( 'importQuote with a post' , function ( ) {
2013-07-04 13:35:15 -04:00
expect ( 1 ) ;
this . stub ( Discourse . Post , 'load' ) . withArgs ( 123 ) . returns ( Em . Deferred . promise ( function ( p ) {
p . resolve ( Discourse . Post . create ( { raw : "let's quote" } ) ) ;
} ) ) ;
var composer = Discourse . Composer . create ( { post : Discourse . Post . create ( { id : 123 } ) } ) ;
composer . importQuote ( ) . then ( function ( ) {
start ( ) ;
ok ( composer . get ( 'reply' ) . indexOf ( "let's quote" ) > - 1 , "it quoted the post" ) ;
} ) ;
} ) ;
2013-07-15 19:47:13 -04:00
asyncTestDiscourse ( 'importQuote with no post' , function ( ) {
2013-07-04 13:35:15 -04:00
expect ( 1 ) ;
this . stub ( Discourse . Post , 'load' ) . withArgs ( 4 ) . returns ( Em . Deferred . promise ( function ( p ) {
p . resolve ( Discourse . Post . create ( { raw : 'quote me' } ) ) ;
} ) ) ;
var composer = Discourse . Composer . create ( { topic : Discourse . Topic . create ( ) } ) ;
composer . set ( 'topic.postStream.stream' , [ 4 , 5 ] ) ;
composer . importQuote ( ) . then ( function ( ) {
start ( ) ;
ok ( composer . get ( 'reply' ) . indexOf ( 'quote me' ) > - 1 , "it contains the word quote me" ) ;
} ) ;
} ) ;
2013-07-05 13:01:51 -04:00
test ( 'clearState' , function ( ) {
var composer = Discourse . Composer . create ( {
originalText : 'asdf' ,
reply : 'asdf2' ,
post : Discourse . Post . create ( { id : 1 } ) ,
title : 'wat'
} ) ;
composer . clearState ( ) ;
blank ( composer . get ( 'originalText' ) ) ;
blank ( composer . get ( 'reply' ) ) ;
blank ( composer . get ( 'post' ) ) ;
blank ( composer . get ( 'title' ) ) ;
} ) ;
2013-08-21 16:14:04 -04:00
test ( 'initial category when uncategorized is allowed' , function ( ) {
Discourse . SiteSettings . allow _uncategorized _topics = true ;
var composer = Discourse . Composer . open ( { action : 'createTopic' , draftKey : 'asfd' , draftSequence : 1 } ) ;
2013-07-18 00:58:25 +02:00
equal ( composer . get ( 'categoryId' ) , undefined , "Uncategorized by default" ) ;
2013-08-21 16:14:04 -04:00
} ) ;
test ( 'initial category when uncategorized is not allowed' , function ( ) {
Discourse . SiteSettings . allow _uncategorized _topics = false ;
var composer = Discourse . Composer . open ( { action : 'createTopic' , draftKey : 'asfd' , draftSequence : 1 } ) ;
2013-10-08 14:40:31 -04:00
ok ( composer . get ( 'categoryId' ) === undefined , "Uncategorized by default. Must choose a category." ) ;
2013-10-17 12:19:09 -04:00
} ) ;
test ( 'showPreview' , function ( ) {
var new _composer = function ( ) {
return Discourse . Composer . open ( { action : 'createTopic' , draftKey : 'asfd' , draftSequence : 1 } ) ;
} ;
Discourse . Mobile . mobileView = true ;
equal ( new _composer ( ) . get ( 'showPreview' ) , false , "Don't show preview in mobile view" ) ;
Discourse . KeyValueStore . set ( { key : 'composer.showPreview' , value : 'true' } ) ;
equal ( new _composer ( ) . get ( 'showPreview' ) , false , "Don't show preview in mobile view even if KeyValueStore wants to" ) ;
Discourse . KeyValueStore . remove ( 'composer.showPreview' ) ;
Discourse . Mobile . mobileView = false ;
equal ( new _composer ( ) . get ( 'showPreview' ) , true , "Show preview by default in desktop view" ) ;
} ) ;
2013-11-15 13:13:42 -05:00
test ( 'open with a quote' , function ( ) {
var quote = '[quote="neil, post:5, topic:413"]\nSimmer down you two.\n[/quote]' ;
var new _composer = function ( ) {
return Discourse . Composer . open ( { action : Discourse . Composer . REPLY , draftKey : 'asfd' , draftSequence : 1 , quote : quote } ) ;
} ;
equal ( new _composer ( ) . get ( 'originalText' ) , quote , "originalText is the quote" ) ;
equal ( new _composer ( ) . get ( 'replyDirty' ) , false , "replyDirty is initally false with a quote" ) ;
} ) ;
2014-07-28 16:40:06 -04:00
module ( "Discourse.Composer as admin" , {
setup : function ( ) {
sinon . stub ( Discourse . User , 'currentProp' ) . withArgs ( 'admin' ) . returns ( true ) ;
} ,
teardown : function ( ) {
Discourse . User . currentProp . restore ( ) ;
}
} ) ;
test ( "Title length for regular topics as admin" , function ( ) {
Discourse . SiteSettings . min _topic _title _length = 5 ;
Discourse . SiteSettings . max _topic _title _length = 10 ;
var composer = Discourse . Composer . create ( ) ;
composer . set ( 'title' , 'asdf' ) ;
ok ( composer . get ( 'titleLengthValid' ) , "admins can use short titles" ) ;
composer . set ( 'title' , 'this is a long title' ) ;
ok ( composer . get ( 'titleLengthValid' ) , "admins can use long titles" ) ;
composer . set ( 'title' , 'just right' ) ;
ok ( composer . get ( 'titleLengthValid' ) , "in the range is okay" ) ;
composer . set ( 'title' , '' ) ;
ok ( ! composer . get ( 'titleLengthValid' ) , "admins must set title to at least 1 character" ) ;
} ) ;