2013-02-05 14:16:51 -05:00
require 'spec_helper'
require 'cooked_post_processor'
describe CookedPostProcessor do
2013-04-10 17:52:38 +10:00
2013-07-08 01:39:08 +02:00
context " post_process " do
2013-02-05 14:16:51 -05:00
2013-07-08 01:39:08 +02:00
let ( :post ) { build ( :post ) }
let ( :cpp ) { CookedPostProcessor . new ( post ) }
let ( :post_process ) { sequence ( " post_process " ) }
2013-02-05 14:16:51 -05:00
2013-07-10 22:59:07 +02:00
it " post process in sequence " do
cpp . expects ( :post_process_attachments ) . in_sequence ( post_process )
2013-07-08 01:39:08 +02:00
cpp . expects ( :post_process_images ) . in_sequence ( post_process )
cpp . expects ( :post_process_oneboxes ) . in_sequence ( post_process )
cpp . post_process
2013-02-05 14:16:51 -05:00
end
2013-07-08 01:39:08 +02:00
end
2013-02-05 14:16:51 -05:00
2013-07-10 22:59:07 +02:00
context " post_process_attachments " do
context " with attachment " do
let ( :upload ) { Fabricate ( :upload ) }
let ( :post ) { Fabricate ( :post_with_an_attachment ) }
let ( :cpp ) { CookedPostProcessor . new ( post ) }
# all in one test to speed things up
it " works " do
Upload . expects ( :get_from_url ) . returns ( upload )
cpp . post_process_attachments
# ensures absolute urls on attachment
cpp . html . should =~ / #{ LocalStore . base_url } /
# ensure name is present
cpp . html . should =~ / archive.zip /
# ensure size is present
cpp . html . should =~ / <span class= \ "size \ "> \ (1.21 KB \ )< \/ span> /
# dirty
cpp . should be_dirty
# keeps the reverse index up to date
post . uploads . reload
post . uploads . count . should == 1
end
end
end
2013-07-08 01:39:08 +02:00
context " post_process_images " do
2013-02-05 14:16:51 -05:00
2013-07-08 01:39:08 +02:00
context " with images in quotes and oneboxes " do
2013-02-05 14:16:51 -05:00
2013-07-08 01:39:08 +02:00
let ( :post ) { build ( :post_with_images_in_quote_and_onebox ) }
let ( :cpp ) { CookedPostProcessor . new ( post ) }
before { cpp . post_process_images }
2013-04-10 17:52:38 +10:00
2013-07-08 01:39:08 +02:00
it " does not process them " do
cpp . html . should match_html post . cooked
cpp . should_not be_dirty
end
it " has no topic image if there isn't one in the post " do
post . topic . image_url . should be_blank
end
2013-02-05 14:16:51 -05:00
end
2013-07-08 01:39:08 +02:00
context " with uploaded images " do
let ( :upload ) { Fabricate ( :upload ) }
let ( :post ) { Fabricate ( :post_with_uploaded_images ) }
let ( :cpp ) { CookedPostProcessor . new ( post ) }
before { FastImage . stubs ( :size ) }
# all in one test to speed things up
it " works " do
Upload . expects ( :get_from_url ) . returns ( upload ) . twice
cpp . post_process_images
# ensures absolute urls on uploaded images
2013-07-10 22:59:07 +02:00
cpp . html . should =~ / #{ LocalStore . base_url } /
2013-07-08 01:39:08 +02:00
# dirty
cpp . should be_dirty
# keeps the reverse index up to date
post . uploads . reload
post . uploads . count . should == 1
2013-02-05 14:16:51 -05:00
end
2013-07-08 01:39:08 +02:00
end
2013-07-10 22:59:07 +02:00
context " with sized images " do
2013-07-08 01:39:08 +02:00
let ( :post ) { build ( :post_with_image_url ) }
let ( :cpp ) { CookedPostProcessor . new ( post , image_sizes : { 'http://foo.bar/image.png' = > { 'width' = > 111 , 'height' = > 222 } } ) }
before { FastImage . stubs ( :size ) . returns ( [ 150 , 250 ] ) }
2013-02-05 14:16:51 -05:00
it " doesn't call image_dimensions because it knows the size " do
2013-07-08 01:39:08 +02:00
cpp . expects ( :image_dimensions ) . never
cpp . post_process_images
2013-02-05 14:16:51 -05:00
end
it " adds the width from the image sizes provided " do
2013-07-08 01:39:08 +02:00
cpp . post_process_images
cpp . html . should =~ / width= \ "111 \ " /
cpp . should be_dirty
2013-02-05 14:16:51 -05:00
end
end
2013-07-08 01:39:08 +02:00
context " with unsized images " do
let ( :post ) { build ( :post_with_unsized_images ) }
let ( :cpp ) { CookedPostProcessor . new ( post ) }
2013-06-17 22:46:48 +02:00
2013-07-08 01:39:08 +02:00
it " adds the width and height to images that don't have them " do
FastImage . expects ( :size ) . returns ( [ 123 , 456 ] )
cpp . post_process_images
cpp . html . should =~ / width="123" height="456" /
cpp . should be_dirty
2013-06-17 22:46:48 +02:00
end
end
2013-07-08 01:39:08 +02:00
context " with large images " do
2013-03-18 13:55:34 -04:00
2013-07-08 01:39:08 +02:00
let ( :upload ) { Fabricate ( :upload ) }
let ( :post ) { build ( :post_with_large_image ) }
let ( :cpp ) { CookedPostProcessor . new ( post ) }
2013-02-05 14:16:51 -05:00
2013-07-08 01:39:08 +02:00
before do
SiteSetting . stubs ( :create_thumbnails? ) . returns ( true )
Upload . expects ( :get_from_url ) . returns ( upload )
cpp . stubs ( :associate_to_post )
FastImage . stubs ( :size ) . returns ( [ 1000 , 2000 ] )
# optimized_image
FileUtils . stubs ( :mkdir_p )
File . stubs ( :open )
ImageSorcery . any_instance . expects ( :convert ) . returns ( true )
2013-02-05 14:16:51 -05:00
end
2013-07-08 01:39:08 +02:00
it " generates overlay information " do
cpp . post_process_images
cpp . html . should match_html ' < div > < a href = " http://test.localhost/uploads/default/1/1234567890123456.jpg " class = " lightbox " > < img src = " http://test.localhost/uploads/default/_optimized/da3/9a3/ee5e6b4b0d3_100x200.jpg " width = " 690 " height = " 1380 " > < div class = " meta " >
< span class = " filename " > uploaded . jpg < / span><span class="informations">1000x2000 | 1.21 KB< /s pan > < span class = " expand " > < / span>
< / div>< / a > < / div>'
cpp . should be_dirty
2013-02-05 14:16:51 -05:00
end
end
2013-05-30 17:17:07 +02:00
2013-07-08 01:39:08 +02:00
context " topic image " do
2013-05-30 17:17:07 +02:00
2013-07-08 01:39:08 +02:00
let ( :topic ) { build ( :topic , id : 1 ) }
let ( :post ) { Fabricate ( :post_with_uploaded_images , topic : topic ) }
let ( :cpp ) { CookedPostProcessor . new ( post ) }
2013-05-30 17:17:07 +02:00
2013-07-08 01:39:08 +02:00
it " adds a topic image if there's one in the post " do
FastImage . stubs ( :size ) . returns ( [ 100 , 100 ] )
cpp . post_process_images
post . topic . reload
post . topic . image_url . should == " http://test.localhost/uploads/default/2/3456789012345678.png "
2013-05-30 17:17:07 +02:00
end
2013-07-08 01:39:08 +02:00
2013-05-30 17:17:07 +02:00
end
2013-07-08 01:39:08 +02:00
end
2013-06-24 02:10:21 +02:00
2013-07-08 01:39:08 +02:00
context " post_process_oneboxes " do
2013-06-24 02:10:21 +02:00
2013-07-08 01:39:08 +02:00
let ( :post ) { build ( :post_with_youtube , id : 123 ) }
let ( :cpp ) { CookedPostProcessor . new ( post , invalidate_oneboxes : true ) }
before do
Oneboxer . expects ( :onebox ) . with ( " http://www.youtube.com/watch?v=9bZkp7q19f0 " , post_id : 123 , invalidate_oneboxes : true ) . returns ( '<div>GANGNAM STYLE</div>' )
cpp . post_process_oneboxes
2013-06-24 02:10:21 +02:00
end
2013-07-08 01:39:08 +02:00
it " should be dirty " do
cpp . should be_dirty
end
2013-06-26 02:44:20 +02:00
2013-07-08 01:39:08 +02:00
it " inserts the onebox without wrapping p " do
cpp . html . should match_html " <div>GANGNAM STYLE</div> "
end
2013-06-26 02:44:20 +02:00
2013-07-08 01:39:08 +02:00
end
2013-06-26 02:44:20 +02:00
2013-07-08 01:39:08 +02:00
context " get_filename " do
2013-06-26 02:44:20 +02:00
2013-07-08 01:39:08 +02:00
let ( :post ) { build ( :post ) }
let ( :cpp ) { CookedPostProcessor . new ( post ) }
it " returns the filename of the src when there is no upload " do
cpp . get_filename ( nil , " http://domain.com/image.png " ) . should == " image.png "
2013-06-26 02:44:20 +02:00
end
2013-07-08 01:39:08 +02:00
it " returns the original filename of the upload when there is an upload " do
upload = build ( :upload , { original_filename : " upload.jpg " } )
cpp . get_filename ( upload , " http://domain.com/image.png " ) . should == " upload.jpg "
end
2013-02-05 14:16:51 -05:00
2013-07-08 01:39:08 +02:00
it " returns a generic name for pasted images " do
upload = build ( :upload , { original_filename : " blob.png " } )
cpp . get_filename ( upload , " http://domain.com/image.png " ) . should == I18n . t ( 'upload.pasted_image_filename' )
2013-02-19 17:57:14 +11:00
end
2013-02-25 19:42:20 +03:00
2013-07-08 01:39:08 +02:00
end
context " image_dimensions " do
let ( :post ) { build ( :post ) }
let ( :cpp ) { CookedPostProcessor . new ( post ) }
2013-02-19 17:57:14 +11:00
2013-07-08 01:39:08 +02:00
it " calls the resizer " do
SiteSetting . stubs ( :max_image_width ) . returns ( 200 )
cpp . expects ( :get_size ) . returns ( [ 1000 , 2000 ] )
cpp . image_dimensions ( " http://foo.bar/image.png " ) . should == [ 200 , 400 ]
2013-02-19 17:57:14 +11:00
end
2013-07-08 01:39:08 +02:00
it " doesn't call the resizer when there is no size " do
cpp . expects ( :get_size ) . returns ( nil )
cpp . image_dimensions ( " http://foo.bar/image.png " ) . should == nil
2013-02-19 17:57:14 +11:00
end
2013-02-25 19:42:20 +03:00
2013-02-19 17:57:14 +11:00
end
2013-02-05 14:16:51 -05:00
2013-07-08 01:39:08 +02:00
context " get_size " do
let ( :post ) { build ( :post ) }
let ( :cpp ) { CookedPostProcessor . new ( post ) }
2013-07-06 19:10:53 +02:00
2013-07-08 01:39:08 +02:00
it " ensures s3 urls have a default scheme " do
Upload . stubs ( :is_on_s3? ) . returns ( true )
FastImage . stubs ( :size )
cpp . expects ( :is_valid_image_uri? ) . with ( " http://bucket.s3.aws.amazon.com/image.jpg " )
cpp . get_size ( " //bucket.s3.aws.amazon.com/image.jpg " )
2013-02-05 14:16:51 -05:00
end
2013-07-08 01:39:08 +02:00
context " crawl_images is disabled " do
2013-02-05 14:16:51 -05:00
2013-07-08 01:39:08 +02:00
before { SiteSetting . stubs ( :crawl_images? ) . returns ( false ) }
2013-07-06 19:10:53 +02:00
2013-07-08 01:39:08 +02:00
it " doesn't call FastImage " do
2013-02-05 14:16:51 -05:00
FastImage . expects ( :size ) . never
2013-07-08 01:39:08 +02:00
cpp . get_size ( " http://foo.bar/image.png " ) . should == nil
2013-02-05 14:16:51 -05:00
end
2013-07-08 01:39:08 +02:00
it " is always allowed to crawled our own images " do
Upload . expects ( :has_been_uploaded? ) . returns ( true )
FastImage . expects ( :size ) . returns ( [ 100 , 200 ] )
cpp . get_size ( " http://foo.bar/image.png " ) . should == [ 100 , 200 ]
2013-02-25 19:42:20 +03:00
end
2013-07-08 01:39:08 +02:00
end
it " caches the results " do
SiteSetting . stubs ( :crawl_images? ) . returns ( true )
FastImage . expects ( :size ) . returns ( [ 200 , 400 ] )
cpp . get_size ( " http://foo.bar/image.png " )
cpp . get_size ( " http://foo.bar/image.png " ) . should == [ 200 , 400 ]
2013-02-05 14:16:51 -05:00
end
2013-07-06 19:10:53 +02:00
2013-02-05 14:16:51 -05:00
end
2013-07-06 19:10:53 +02:00
context " is_valid_image_uri? " do
2013-06-22 13:38:42 +02:00
2013-07-08 01:39:08 +02:00
let ( :post ) { build ( :post ) }
let ( :cpp ) { CookedPostProcessor . new ( post ) }
2013-06-22 13:38:42 +02:00
it " needs the scheme to be either http or https " do
cpp . is_valid_image_uri? ( " http://domain.com " ) . should == true
cpp . is_valid_image_uri? ( " https://domain.com " ) . should == true
cpp . is_valid_image_uri? ( " ftp://domain.com " ) . should == false
cpp . is_valid_image_uri? ( " ftps://domain.com " ) . should == false
cpp . is_valid_image_uri? ( " //domain.com " ) . should == false
cpp . is_valid_image_uri? ( " /tmp/image.png " ) . should == false
2013-06-15 12:29:20 +02:00
end
2013-07-06 19:10:53 +02:00
it " doesn't throw an exception with a bad URI " do
2013-06-24 22:56:03 +02:00
cpp . is_valid_image_uri? ( " http://do<main.com " ) . should == nil
end
2013-06-15 12:29:20 +02:00
end
2013-02-05 14:16:51 -05:00
end