web_resource_bundler 0.0.13

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. data/.bundle/config +2 -0
  2. data/.gitignore +21 -0
  3. data/Gemfile +2 -0
  4. data/Gemfile.lock +10 -0
  5. data/README +118 -0
  6. data/Rakefile +29 -0
  7. data/VERSION +1 -0
  8. data/lib/web_resource_bundler.rb +195 -0
  9. data/lib/web_resource_bundler/content_management/block_data.rb +57 -0
  10. data/lib/web_resource_bundler/content_management/block_parser.rb +63 -0
  11. data/lib/web_resource_bundler/content_management/css_url_rewriter.rb +23 -0
  12. data/lib/web_resource_bundler/content_management/resource_file.rb +35 -0
  13. data/lib/web_resource_bundler/exceptions.rb +26 -0
  14. data/lib/web_resource_bundler/file_manager.rb +30 -0
  15. data/lib/web_resource_bundler/filters.rb +9 -0
  16. data/lib/web_resource_bundler/filters/base_filter.rb +28 -0
  17. data/lib/web_resource_bundler/filters/bundle_filter.rb +58 -0
  18. data/lib/web_resource_bundler/filters/bundle_filter/resource_packager.rb +49 -0
  19. data/lib/web_resource_bundler/filters/cdn_filter.rb +48 -0
  20. data/lib/web_resource_bundler/filters/image_encode_filter.rb +56 -0
  21. data/lib/web_resource_bundler/filters/image_encode_filter/css_generator.rb +85 -0
  22. data/lib/web_resource_bundler/filters/image_encode_filter/image_data.rb +51 -0
  23. data/lib/web_resource_bundler/rails_app_helpers.rb +65 -0
  24. data/lib/web_resource_bundler/settings.rb +46 -0
  25. data/lib/web_resource_bundler/web_resource_bundler_init.rb +17 -0
  26. data/spec/public/foo.css +4 -0
  27. data/spec/public/images/good.jpg +0 -0
  28. data/spec/public/images/logo.jpg +0 -0
  29. data/spec/public/images/sdfo.jpg +0 -0
  30. data/spec/public/images/too_big_image.jpg +0 -0
  31. data/spec/public/marketing.js +14 -0
  32. data/spec/public/salog20.js +6 -0
  33. data/spec/public/sample.css +6 -0
  34. data/spec/public/seal.js +10 -0
  35. data/spec/public/set_cookies.js +8 -0
  36. data/spec/public/styles/boo.css +4 -0
  37. data/spec/public/styles/for_import.css +7 -0
  38. data/spec/public/temp.css +1 -0
  39. data/spec/public/test.css +2 -0
  40. data/spec/sample_block_helper.rb +81 -0
  41. data/spec/spec_helper.rb +82 -0
  42. data/spec/web_resource_bundler/content_management/block_data_spec.rb +33 -0
  43. data/spec/web_resource_bundler/content_management/block_parser_spec.rb +100 -0
  44. data/spec/web_resource_bundler/content_management/css_url_rewriter_spec.rb +27 -0
  45. data/spec/web_resource_bundler/content_management/resource_file_spec.rb +37 -0
  46. data/spec/web_resource_bundler/file_manager_spec.rb +60 -0
  47. data/spec/web_resource_bundler/filters/bundle_filter/filter_spec.rb +40 -0
  48. data/spec/web_resource_bundler/filters/bundle_filter/resource_packager_spec.rb +41 -0
  49. data/spec/web_resource_bundler/filters/cdn_filter_spec.rb +76 -0
  50. data/spec/web_resource_bundler/filters/image_encode_filter/css_generator_spec.rb +104 -0
  51. data/spec/web_resource_bundler/filters/image_encode_filter/filter_spec.rb +73 -0
  52. data/spec/web_resource_bundler/filters/image_encode_filter/image_data_spec.rb +53 -0
  53. data/spec/web_resource_bundler/settings_spec.rb +45 -0
  54. data/spec/web_resource_bundler/web_resource_bundler_spec.rb +90 -0
  55. data/web_resource_bundler.gemspec +111 -0
  56. metadata +146 -0
@@ -0,0 +1,100 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "../../spec_helper"))
2
+ module WebResourceBundler
3
+ describe BlockParser do
4
+
5
+ before(:each) do
6
+ @file_manager = FileManager.new(settings.resource_dir, settings.cache_dir)
7
+ @block_parser = BlockParser.new
8
+ end
9
+
10
+ #conditional comment spec
11
+ it "matches with different conditional comments" do
12
+ tests = ['<!--[if lte IE 7]>...<![endif]-->','<!--[if !(IE 7)]>...<![endif]-->',
13
+ '<!--[if IE]>...<![endif]-->']
14
+ tests.each do |test|
15
+ BlockParser::CONDITIONAL_BLOCK_PATTERN.should match(test)
16
+ end
17
+ end
18
+
19
+ #links pattern spec
20
+ it "matches with css or js link" do
21
+ tests = ["\<link href='\/cache\/style.css' \/\>","\<script src='\/cache\/script.js' \/script\>"]
22
+ tests.each do |link|
23
+ BlockParser::LINK_PATTERN.should match(link)
24
+ end
25
+ end
26
+
27
+ describe "#remove_links" do
28
+ it "deletes all links to resources (js, css) from block" do
29
+ block = @sample_block_helper.construct_links_block(styles, scripts)
30
+ block += @sample_block_helper.sample_inline_block
31
+ block += @sample_block_helper.construct_links_block(styles, scripts)
32
+ block += @sample_block_helper.sample_inline_block
33
+ @block_parser.remove_links(block).should == @sample_block_helper.sample_inline_block + @sample_block_helper.sample_inline_block
34
+ end
35
+
36
+ it "doesn't delete links to non js or css resource, like favicon for example" do
37
+ text = "<link href='1.css' /><link rel='shortcut icon' href='/favicon.ico' />"
38
+ @block_parser.remove_links(text).should == "<link rel='shortcut icon' href='/favicon.ico' />"
39
+ end
40
+
41
+ it "doesn't touch remote resources" do
42
+ text = "<link href='http://google.com/1.css' type='text/css' rel='stylesheet' />"
43
+ @block_parser.remove_links(text).include?(text).should be_true
44
+ end
45
+ end
46
+
47
+ describe "#parse" do
48
+
49
+ it "returns BlockData object" do
50
+ @block_parser.parse("").is_a?(BlockData).should be_true
51
+ end
52
+
53
+
54
+
55
+ it "returns empty BlockData when block is empty" do
56
+ data = @block_parser.parse("")
57
+ data.files.should be_empty
58
+ end
59
+
60
+ def compare_block_datas(a,b)
61
+ a.files.size.should == b.files.size
62
+ (a.files.map {|f| f.path} - b.files.map{|f| f.path}).should be_empty
63
+ a.child_blocks.size.should == b.child_blocks.size
64
+ a.condition.should == b.condition
65
+ end
66
+
67
+ it "return BlockData with all content and child inline blocks" do
68
+ block_data = @block_parser.parse(@sample_block_helper.sample_block)
69
+ compare_block_datas(block_data, @sample_block_helper.sample_block_data)
70
+ compare_block_datas(block_data.child_blocks[0], @sample_block_helper.sample_block_data.child_blocks[0])
71
+ end
72
+
73
+ end
74
+
75
+ describe "#find_files" do
76
+
77
+ it "returns array of css and js files linked in block" do
78
+ result = @block_parser.find_files(@sample_block_helper.construct_links_block(styles, scripts))
79
+ files = styles + scripts
80
+ result.each do |f|
81
+ files.include?(f.path).should be_true
82
+ end
83
+ end
84
+
85
+ it "recognize only css and js files" do
86
+ block = "<link href='/rss.atom' /> <link href='valid.css' />"
87
+ result = @block_parser.find_files(block)
88
+ result.first.path.should == 'valid.css'
89
+ end
90
+
91
+ it "recognize files only on disk, not full urls" do
92
+ block = "<link href='http://glogle.com/web.css' /> <link href='valid.css' />"
93
+ result = @block_parser.find_files(block)
94
+ result.first.path.should == 'valid.css'
95
+ end
96
+
97
+ end
98
+
99
+ end
100
+ end
@@ -0,0 +1,27 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "../../spec_helper"))
2
+ describe WebResourceBundler::CssUrlRewriter do
3
+ describe "#rewrite_relative_path" do
4
+ it "returns absolute path using url and css file path" do
5
+ tests = {
6
+ "../image.gif" => "/styles/image.gif",
7
+ "./image.gif" => "/styles/skin/image.gif",
8
+ "../../image.gif" => "/image.gif",
9
+ "../.././1.gif" => '/1.gif',
10
+ '.././../styles/./../styles/3.jpg' => '/styles/3.jpg'
11
+ }
12
+ css_file_path = "/styles/skin/1.css"
13
+ tests.each do |key, value|
14
+ CssUrlRewriter.rewrite_relative_path(css_file_path, key).should == value
15
+ end
16
+ end
17
+ end
18
+ describe "#rewrite_content_urls" do
19
+ it "rewrites all urls in css block" do
20
+ css = "abracada: url\t('../image.gif'); \n backaground-image: url(\"../../image.gif\");background: url(./i/backgrounds/menu.png) repeat-x 0 100%; }"
21
+ result = "abracada: url('\/styles\/image.gif'); \n backaground-image: url('\/image.gif');background: url('/styles/skin/i/backgrounds/menu.png') repeat-x 0 100%; }"
22
+ CssUrlRewriter.rewrite_content_urls!("/styles/skin/1.css", css).should == result
23
+ end
24
+ end
25
+
26
+ end
27
+
@@ -0,0 +1,37 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "../../spec_helper"))
2
+ describe WebResourceBundler::ResourceFile do
3
+ describe "#new_css_file" do
4
+ it "creates new resource file of css type" do
5
+ f = WebResourceBundler::ResourceFile.new_css_file('a', 'b')
6
+ f.path.should == 'a'
7
+ f.content.should == 'b'
8
+ f.type.should == WebResourceBundler::ResourceFileType::CSS
9
+ end
10
+ end
11
+ describe "#new_js_file" do
12
+ it "creates new resource file of css type" do
13
+ f = WebResourceBundler::ResourceFile.new_js_file('a', 'b')
14
+ f.path.should == 'a'
15
+ f.content.should == 'b'
16
+ f.type.should == WebResourceBundler::ResourceFileType::JS
17
+ end
18
+ end
19
+ describe "#new_mhtml_file" do
20
+ it "creates new resource file of mhtml type" do
21
+ f = WebResourceBundler::ResourceFile.new_mhtml_file('a', 'b')
22
+ f.path.should == 'a'
23
+ f.content.should == 'b'
24
+ f.type.should == WebResourceBundler::ResourceFileType::MHTML
25
+ end
26
+ end
27
+ describe "#clone" do
28
+ it "creates full clone of resource file object" do
29
+ f = WebResourceBundler::ResourceFile.new_css_file('a', 'b')
30
+ clon = f.clone
31
+ f.object_id.should_not == clon.object_id
32
+ f.path.object_id.should_not == clon.path.object_id
33
+ f.content.object_id.should_not == clon.content.object_id
34
+ end
35
+ end
36
+ end
37
+
@@ -0,0 +1,60 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "../spec_helper"))
2
+ describe WebResourceBundler::FileManager do
3
+ before(:each) do
4
+ @settings = settings
5
+ end
6
+
7
+ def create_stub_file(name)
8
+ File.open(File.join(@settings.resource_dir, name), "w") do |file|
9
+ file.print "hi there"
10
+ end
11
+ end
12
+
13
+ before(:each) do
14
+ temp_dir = File.join(@settings.resource_dir, 'temp')
15
+ Dir.mkdir(temp_dir) unless File.exist?(temp_dir)
16
+ @bundle_url = 'temp/bundle.dat'
17
+ @bundle_path = File.join(@settings.resource_dir, @bundle_url)
18
+ create_stub_file(@bundle_url)
19
+ @manager = FileManager.new(@settings.resource_dir, @settings.cache_dir)
20
+ end
21
+
22
+ after(:each) do
23
+ FileUtils.rm_rf(File.join(@settings.resource_dir, 'temp'))
24
+ end
25
+
26
+ describe "#create_cache_dir" do
27
+ it "creates cache dir if it doesn't exists" do
28
+ dir_path = File.join(@settings.resource_dir, @settings.cache_dir)
29
+ FileUtils.rm_rf(dir_path)
30
+ @manager.create_cache_dir
31
+ File.exist?(dir_path).should == true
32
+ end
33
+ end
34
+
35
+ describe "#get_content" do
36
+ it "reads file and returns its content" do
37
+ @manager.get_content(@bundle_url).should == 'hi there'
38
+ end
39
+ end
40
+
41
+ describe "#full_path" do
42
+
43
+ it "returns full path using file url" do
44
+ @manager.full_path(@bundle_url).should == @bundle_path
45
+ end
46
+
47
+ end
48
+
49
+ describe "#exist?" do
50
+
51
+ it "returns false when no such file in resource dir" do
52
+ @manager.exist?("non_existent_file.data").should == false
53
+ end
54
+
55
+ it "return true when file exists in resource dir" do
56
+ @manager.exist?(@bundle_url).should == true
57
+ end
58
+ end
59
+
60
+ end
@@ -0,0 +1,40 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "../../../spec_helper"))
2
+ describe WebResourceBundler::Filters::BundleFilter::Filter do
3
+ before(:each) do
4
+ clean_cache_dir
5
+ @settings = settings
6
+ @bundle_settings = bundle_settings
7
+ @filter = Filters::BundleFilter::Filter.new(@bundle_settings, FileManager.new(@settings.resource_dir, @settings.cache_dir))
8
+ @block_data = @sample_block_helper.sample_block_data
9
+ css_type = ResourceFileType::CSS
10
+ js_type = ResourceFileType::JS
11
+ items = [@block_data.styles.map {|f| f.path}.sort] + @bundle_settings[:md5_additional_data]
12
+ @css_md5_value = Digest::MD5.hexdigest(items.flatten.join('|'))
13
+ @css_bundle_file = File.join(@settings.cache_dir, [css_type[:name] + '_' + @css_md5_value, 'en', css_type[:ext]].join('.'))
14
+ items = [@block_data.scripts.map {|f| f.path}.sort] + @bundle_settings[:md5_additional_data]
15
+ js_md5_value = Digest::MD5.hexdigest(items.flatten.join('|'))
16
+ @js_bundle_file = File.join(@settings.cache_dir, [js_type[:name] + '_' + js_md5_value, 'en', js_type[:ext]].join('.'))
17
+ end
18
+
19
+ describe "#apply" do
20
+ it "bundles each block_data resources in single file" do
21
+ @filter.apply!(@block_data)
22
+ @block_data.styles.first.path.should == @css_bundle_file
23
+ @block_data.scripts.first.path.should == @js_bundle_file
24
+ end
25
+ end
26
+
27
+ describe "#get_md5" do
28
+ it "returns md5 from sorted filepaths and another additional data" do
29
+ @filter.get_md5(@block_data.styles).should == @css_md5_value
30
+ end
31
+ end
32
+
33
+ describe "#bundle_filepath" do
34
+ it "returns filename of bundle constructed from passed files" do
35
+ @filter.bundle_filepath(WebResourceBundler::ResourceFileType::CSS, @block_data.styles).should == @css_bundle_file
36
+ end
37
+ end
38
+
39
+ end
40
+
@@ -0,0 +1,41 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "../../../spec_helper"))
2
+ require 'digest/md5'
3
+ describe WebResourceBundler::Filters::BundleFilter::ResourcePackager do
4
+ before(:each) do
5
+ @settings = settings
6
+ file_manager = FileManager.new(@settings.resource_dir, @settings.cache_dir)
7
+ @file_packager = Filters::BundleFilter::ResourcePackager.new(@settings, file_manager)
8
+ @file_paths = styles.map do |url|
9
+ File.join(@settings.resource_dir, url)
10
+ end
11
+ end
12
+
13
+ describe "#extract_imported_files!" do
14
+ it "returns array of imported css files" do
15
+ content = "@import 'import/first.css';\n@import 'import/second.css';"
16
+ imported_files = @file_packager.extract_imported_files!(content, 'styles/base.css')
17
+ content.should == "\n"
18
+ imported_files.should == ['styles/import/first.css', 'styles/import/second.css']
19
+ end
20
+ end
21
+
22
+ describe "#bundle_files" do
23
+ it "throws ResourceNotFoundError exception if one of imported files not found" do
24
+ #creating file with content with imported unexistent files
25
+ files = [WebResourceBundler::ResourceFile.new_css_file('styles/base.css', "@import 'import/first.css';\n@import 'import/second.css';")]
26
+ lambda { @file_packager.bundle_files(files) }.should raise_error(Exceptions::ResourceNotFoundError)
27
+ end
28
+
29
+ it 'should bundle files in original order' do
30
+ files = [
31
+ WebResourceBundler::ResourceFile.new_js_file('files/jquery.js', 'JQUERY_FILE'),
32
+ WebResourceBundler::ResourceFile.new_js_file('files/jquery.carousel.js','JQUERY_CAROUSEL_FILE')
33
+ ]
34
+ result = @file_packager.bundle_files(files)
35
+ (result =~ /JQUERY_FILE/).should < (result =~ /JQUERY_CAROUSEL_FILE/)
36
+ end
37
+
38
+ end
39
+
40
+ end
41
+
@@ -0,0 +1,76 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "../../spec_helper"))
2
+ describe WebResourceBundler::Filters::CdnFilter do
3
+ before(:each) do
4
+ @settings = settings
5
+ @cdn_settings = cdn_settings
6
+ @cdn_settings[:http_hosts] = ['http://boogle.com']
7
+ @cdn_settings[:https_hosts] = ['http://froogle.com']
8
+ @settings[:cdn_filter][:http_hosts] = @cdn_settings[:http_hosts]
9
+ @settings[:cdn_filter][:https_hosts] = @cdn_settings[:https_hosts]
10
+ @file_manager = FileManager.new(@settings.resource_dir, @settings.cache_dir)
11
+ @filter = Filters::CdnFilter::Filter.new(@cdn_settings, @file_manager)
12
+ end
13
+
14
+ describe "#host_for_image" do
15
+ it "returns host for image using its hash" do
16
+ @cdn_settings[:http_hosts] << 'http://froogle.com'
17
+ url = '/images/1.gif'
18
+ @filter.host_for_image(url).should == @cdn_settings[:http_hosts][url.hash % @cdn_settings[:http_hosts].size]
19
+ end
20
+
21
+ it "returns https host if request was https" do
22
+ @cdn_settings[:protocol] = 'https'
23
+ @filter = Filters::CdnFilter::Filter.new(@cdn_settings, @file_manager)
24
+ url = '/images/1.gif'
25
+ @filter.host_for_image(url).should == @cdn_settings[:https_hosts][url.hash % @cdn_settings[:https_hosts].size]
26
+ end
27
+ end
28
+
29
+ describe "#new_filename" do
30
+ it "adds cdn_ prefix to original file name" do
31
+ path = 'styles/1.css'
32
+ @filter.new_filepath(path).should == 'cache/cdn_1.css'
33
+ end
34
+ end
35
+
36
+ describe "#rewrite_content_urls!" do
37
+ before(:each) do
38
+ @file_path = '/styles/skin/1.css'
39
+ end
40
+
41
+ it "adds hosts to image urls" do
42
+ content = "background: url('../images/1.png');"
43
+ @filter.rewrite_content_urls!(@file_path, content)
44
+ content.should == "background: url('http://boogle.com/styles/images/1.png');"
45
+ end
46
+
47
+ it "doesn't add hosts for images encoded in base64" do
48
+ content = "background:url('data:image/png;base64,iVBORw0KGg); *background:url(mhtml:http://domain.com/cache/base64_ie_style_9648c01be7e50284958eb07877c70e03.en.css!rails5804) no-repeat 0 100%;"
49
+ clon = content.dup
50
+ @filter.rewrite_content_urls!(@file_path, content.dup)
51
+ content.should == clon
52
+ end
53
+
54
+ it "binds image to one particular host" do
55
+ @cdn_settings[:http_hosts] << 'http://froogle.com'
56
+ @filter = Filters::CdnFilter::Filter.new(@cdn_settings, @file_manager)
57
+ content = "background: url('../images/1.png');background-image: url('../images/1.png');"
58
+ host = @cdn_settings[:http_hosts]['/styles/images/1.png'.hash % @cdn_settings[:http_hosts].size]
59
+ url = "#{host}/styles/images/1.png"
60
+ @filter.rewrite_content_urls!(@file_path, content)
61
+ content.should == "background: url('#{url}');background-image: url('#{url}');"
62
+ end
63
+ end
64
+
65
+ describe "#apply" do
66
+ it "rewrites urls properly in all css file of given block_data" do
67
+ file = WebResourceBundler::ResourceFile.new_css_file('/temp.css', "background: url('./images/1.png');background-image: url('./images/1.png');")
68
+ block_data = BlockData.new
69
+ block_data.files = [file]
70
+ @filter.apply!(block_data)
71
+ block_data.files.first.path.should == File.join(@settings.cache_dir, 'cdn_temp.css')
72
+ block_data.files.first.content.should == "background: url('http://boogle.com/images/1.png');background-image: url('http://boogle.com/images/1.png');"
73
+ end
74
+ end
75
+
76
+ end
@@ -0,0 +1,104 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "../../../spec_helper"))
2
+ module WebResourceBundler::Filters::ImageEncodeFilter
3
+ describe CssGenerator do
4
+ before(:each) do
5
+ @settings = Settings.new base64_settings
6
+ @generator = CssGenerator.new(@settings, FileManager.new(@settings.resource_dir, @settings.cache_dir))
7
+ end
8
+
9
+ describe "#pattern" do
10
+ it "should match with correct original tags" do
11
+ correct_values = ["#{CssGenerator::TAGS[0]}:url('temp/image.png');",
12
+ " #{CssGenerator::TAGS[1]}\t :\n url('temp/image.png') ;",
13
+ "background:url('temp/1.png') repeat 0 0;"]
14
+ correct_values.each do |v|
15
+ v.should match(CssGenerator::PATTERN)
16
+ end
17
+ end
18
+
19
+ it "should not match with incorrect tags" do
20
+ incorrect_values = ["handy_dandy_tag:url('goody/truly.png')","background-image:urlec('asd/asdf.gif');",
21
+ "background-imageis:url('asdf/asdf.jpg');}"]
22
+ incorrect_values.each do |v|
23
+ v.should_not match(CssGenerator::PATTERN)
24
+ end
25
+ end
26
+ end
27
+
28
+ describe "#encode_images_basic" do
29
+
30
+ before(:each) do
31
+ @content = "background-image: url('images/logo.jpg'); background: url('images/logo.jpg');"
32
+ @images = @generator.encode_images_basic!(@content) do |image_data, tag|
33
+ tag + image_data.extension
34
+ end
35
+ end
36
+
37
+ it "substitute each image tag (image should exist and has proper size) with result of a yield" do
38
+ @content.should == "background-image: jpg; background: jpg;"
39
+ end
40
+
41
+ it "returns hash of images found and with proper size" do
42
+ @images.size.should == 1
43
+ @images['images/logo.jpg'].should be_an_instance_of(ImageData)
44
+ end
45
+
46
+ end
47
+
48
+ context "no images in css file" do
49
+ before(:each) do
50
+ @path = 'path'
51
+ @content = 'margin: 10px;'
52
+ @file = WebResourceBundler::ResourceFile.new_css_file(@path, @content)
53
+ end
54
+ describe "#encode_images!" do
55
+ it "content isn't changed if no images found" do
56
+ images = @generator.encode_images!(@file.content)
57
+ @file.content.should == @content
58
+ images.should be_empty
59
+ end
60
+ end
61
+ describe "#encode_images_for_ie" do
62
+ it "returns original content if no images found" do
63
+ @generator.encode_images_for_ie!(@file.content, 'cache/1.mhtml')
64
+ @file.content.should == @content
65
+ end
66
+
67
+ end
68
+ end
69
+ context "css files has images" do
70
+ before(:each) do
71
+ @path = 'style.css'
72
+ @content = "background: #eeeeee url('images/logo.jpg') repeat-x 0 100%;"
73
+ @file = WebResourceBundler::ResourceFile.new_css_file(@path, @content)
74
+ end
75
+ describe "#encode_images" do
76
+ it "return images hash" do
77
+ images = @generator.encode_images!(@content)
78
+ images.size.should == 1
79
+ end
80
+
81
+ it "modifies content with encoded images" do
82
+ @generator.encode_images!(@file.content)
83
+ @file.content.include?("background: #eeeeee url('data:image").should be_true
84
+ @file.content.include?("repeat-x 0 100%").should be_true
85
+ end
86
+ end
87
+ describe "#encode_images_for_ie" do
88
+ it "changes urls to mhtml link" do
89
+ @generator.encode_images_for_ie!(@content, 'cache/1.mhtml')
90
+ @content.include?("mhtml:#{@settings.protocol}://#{@settings.domain}/cache/1.mhtml!").should be_true
91
+ @content.include?("background: #eeeeee url(mhtml:").should be_true
92
+ @content.include?("repeat-x 0 100%").should be_true
93
+ end
94
+ end
95
+ end
96
+
97
+ describe "#construct_mhtml_link" do
98
+ it "should create link without public folder" do
99
+ @generator.construct_mhtml_link("temp.css").should == "http://#{@settings.domain}/temp.css"
100
+ end
101
+ end
102
+ end
103
+ end
104
+