2013-02-06 20:09:31 -05:00
# encoding: utf-8
2015-10-11 10:41:23 +01:00
require 'rails_helper'
2013-02-06 20:09:31 -05:00
require 'text_sentinel'
describe TextSentinel do
2013-04-10 11:00:50 +02:00
it " allows utf-8 chars " do
2015-01-09 13:34:37 -03:00
expect ( TextSentinel . new ( " йȝîûηыეமிᚉ⠛ " ) . text ) . to eq ( " йȝîûηыეமிᚉ⠛ " )
2013-04-10 11:00:50 +02:00
end
2013-02-06 20:09:31 -05:00
context " entropy " do
it " returns 0 for an empty string " do
2015-01-09 13:34:37 -03:00
expect ( TextSentinel . new ( " " ) . entropy ) . to eq ( 0 )
2013-02-06 20:09:31 -05:00
end
it " returns 0 for a nil string " do
2015-01-09 13:34:37 -03:00
expect ( TextSentinel . new ( nil ) . entropy ) . to eq ( 0 )
2013-02-06 20:09:31 -05:00
end
it " returns 1 for a string with many leading spaces " do
2015-01-09 13:34:37 -03:00
expect ( TextSentinel . new ( ( " " * 10 ) + " x " ) . entropy ) . to eq ( 1 )
2013-02-06 20:09:31 -05:00
end
it " returns 1 for one char, even repeated " do
2015-01-09 13:34:37 -03:00
expect ( TextSentinel . new ( " a " * 10 ) . entropy ) . to eq ( 1 )
2013-02-06 20:09:31 -05:00
end
it " returns an accurate count of many chars " do
2015-01-09 13:34:37 -03:00
expect ( TextSentinel . new ( " evil trout is evil " ) . entropy ) . to eq ( 10 )
2013-02-06 20:09:31 -05:00
end
2013-02-14 16:09:57 -05:00
it " Works on foreign characters " do
2015-01-09 13:34:37 -03:00
expect ( TextSentinel . new ( " 去年十社會警告 " ) . entropy ) . to eq ( 19 )
2013-06-07 14:47:07 -04:00
end
it " generates enough entropy for short foreign strings " do
2015-01-09 13:34:37 -03:00
expect ( TextSentinel . new ( " 又一个测 " ) . entropy ) . to eq ( 11 )
2013-06-07 14:47:07 -04:00
end
it " handles repeated foreign characters " do
2015-01-09 13:34:37 -03:00
expect ( TextSentinel . new ( " 又一个测试话题 " * 3 ) . entropy ) . to eq ( 18 )
2013-02-14 16:09:57 -05:00
end
2013-02-06 20:09:31 -05:00
end
2013-06-17 12:22:23 -04:00
context 'body_sentinel' do
[ 'evil trout is evil' ,
" 去年十社會警告 " ,
" P.S. Пробирочка очень толковая и весьма умная, так что не обнимайтесь. " ,
" LOOK: 去年十社會警告 "
] . each do | valid_body |
it " handles a valid body in a private message " do
expect ( TextSentinel . body_sentinel ( valid_body , private_message : true ) ) . to be_valid
end
it " handles a valid body in a public post " do
expect ( TextSentinel . body_sentinel ( valid_body , private_message : false ) ) . to be_valid
end
end
end
2013-02-06 20:09:31 -05:00
context " validity " do
let ( :valid_string ) { " This is a cool topic about Discourse " }
it " allows a valid string " do
2015-01-09 13:34:37 -03:00
expect ( TextSentinel . new ( valid_string ) ) . to be_valid
2013-02-06 20:09:31 -05:00
end
it " doesn't allow all caps topics " do
2015-01-09 13:34:37 -03:00
expect ( TextSentinel . new ( valid_string . upcase ) ) . not_to be_valid
2013-02-06 20:09:31 -05:00
end
2015-11-17 12:27:44 -08:00
it " allows all caps topics when loud posts are allowed " do
SiteSetting . stubs ( :allow_uppercase_posts ) . returns ( true )
expect ( TextSentinel . new ( valid_string . upcase ) ) . to be_valid
end
2013-02-06 20:09:31 -05:00
it " enforces the minimum entropy " do
2015-01-09 13:34:37 -03:00
expect ( TextSentinel . new ( valid_string , min_entropy : 16 ) ) . to be_valid
2013-02-06 20:09:31 -05:00
end
2013-02-25 19:42:20 +03:00
it " enforces the minimum entropy " do
2015-01-09 13:34:37 -03:00
expect ( TextSentinel . new ( valid_string , min_entropy : 17 ) ) . not_to be_valid
2013-02-06 20:09:31 -05:00
end
2013-02-14 16:09:57 -05:00
it " allows all foreign characters " do
2015-01-09 13:34:37 -03:00
expect ( TextSentinel . new ( " 去年十二月,北韓不顧國際社會警告 " ) ) . to be_valid
2013-02-14 16:09:57 -05:00
end
2013-02-06 20:09:31 -05:00
it " doesn't allow a long alphanumeric string with no spaces " do
2015-01-09 13:34:37 -03:00
expect ( TextSentinel . new ( " jfewjfoejwfojeojfoejofjeo3 " * 5 , max_word_length : 30 ) ) . not_to be_valid
2013-02-06 20:09:31 -05:00
end
2013-08-28 11:04:28 -04:00
it " doesn't accept junk symbols as a string " do
2015-01-09 13:34:37 -03:00
expect ( TextSentinel . new ( " [[[ " ) ) . not_to be_valid
expect ( TextSentinel . new ( " <<< " ) ) . not_to be_valid
expect ( TextSentinel . new ( " {{$! " ) ) . not_to be_valid
2013-02-06 20:09:31 -05:00
end
2013-09-16 09:45:57 -04:00
it " does allow a long alphanumeric string joined with slashes " do
2015-01-09 13:34:37 -03:00
expect ( TextSentinel . new ( " gdfgdfgdfg/fgdfgdfgdg/dfgdfgdfgd/dfgdfgdfgf " , max_word_length : 30 ) ) . to be_valid
2013-09-16 09:45:57 -04:00
end
it " does allow a long alphanumeric string joined with dashes " do
2015-01-09 13:34:37 -03:00
expect ( TextSentinel . new ( " gdfgdfgdfg-fgdfgdfgdg-dfgdfgdfgd-dfgdfgdfgf " , max_word_length : 30 ) ) . to be_valid
2015-05-19 13:10:25 -04:00
end
it " allows a long string with periods " do
expect ( TextSentinel . new ( " error in org.gradle.internal.graph.CachingDirectedGraphWalker " , max_word_length : 30 ) ) . to be_valid
2013-09-16 09:45:57 -04:00
end
2013-02-06 20:09:31 -05:00
end
2013-08-28 11:04:28 -04:00
context 'title_sentinel' do
it " uses a sensible min entropy value when min title length is less than title_min_entropy " do
SiteSetting . stubs ( :min_topic_title_length ) . returns ( 3 )
SiteSetting . stubs ( :title_min_entropy ) . returns ( 10 )
2015-01-09 13:34:37 -03:00
expect ( TextSentinel . title_sentinel ( 'Hey' ) ) . to be_valid
2013-08-28 11:04:28 -04:00
end
end
context 'body_sentinel' do
it " uses a sensible min entropy value when min body length is less than min entropy " do
SiteSetting . stubs ( :min_post_length ) . returns ( 3 )
SiteSetting . stubs ( :body_min_entropy ) . returns ( 7 )
2015-01-09 13:34:37 -03:00
expect ( TextSentinel . body_sentinel ( 'Yup' ) ) . to be_valid
2013-08-28 11:04:28 -04:00
end
it " uses a sensible min entropy value when min pm body length is less than min entropy " do
SiteSetting . stubs ( :min_post_length ) . returns ( 5 )
SiteSetting . stubs ( :min_private_message_post_length ) . returns ( 3 )
SiteSetting . stubs ( :body_min_entropy ) . returns ( 7 )
2015-01-09 13:34:37 -03:00
expect ( TextSentinel . body_sentinel ( 'Lol' , private_message : true ) ) . to be_valid
2013-08-28 11:04:28 -04:00
end
end
2013-02-15 20:58:33 -05:00
end