|
| 1 | +require "spec_helper" |
| 2 | +require_relative "../../lib/image_data_uri" |
| 3 | + |
| 4 | +RSpec.describe ImageDataUri do |
| 5 | + let(:png_data_uri) { "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACklEQVR4nGMAAQAABQABDQottAAAAABJRU5ErkJggg==" } |
| 6 | + let(:jpeg_data_uri) { "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAABAAEDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iiigD//2Q==" } |
| 7 | + |
| 8 | + describe "#initialize" do |
| 9 | + it "parses a valid PNG data URI" do |
| 10 | + image_uri = ImageDataUri.new(png_data_uri) |
| 11 | + expect(image_uri.content_type).to eq("image/png") |
| 12 | + expect(image_uri.encoding).to eq("base64") |
| 13 | + end |
| 14 | + |
| 15 | + it "parses a valid JPEG data URI" do |
| 16 | + image_uri = ImageDataUri.new(jpeg_data_uri) |
| 17 | + expect(image_uri.content_type).to eq("image/jpeg") |
| 18 | + expect(image_uri.encoding).to eq("base64") |
| 19 | + end |
| 20 | + |
| 21 | + it "raises an error for invalid data URI format" do |
| 22 | + expect { ImageDataUri.new("invalid_uri") }.to raise_error(ArgumentError, "Invalid data URI format") |
| 23 | + end |
| 24 | + |
| 25 | + it "raises an error for unsupported encoding" do |
| 26 | + expect { ImageDataUri.new("data:image/png;base32,ABCDEF") }.to raise_error(ArgumentError, "Unsupported encoding") |
| 27 | + end |
| 28 | + end |
| 29 | + |
| 30 | + describe "#to_file" do |
| 31 | + let(:image_uri) { ImageDataUri.new(png_data_uri) } |
| 32 | + |
| 33 | + before do |
| 34 | + allow(File).to receive(:binwrite) |
| 35 | + end |
| 36 | + |
| 37 | + it "writes the file data to the specified path" do |
| 38 | + path = "test_image" |
| 39 | + expect(File).to receive(:binwrite).with("#{path}.png", kind_of(String)) |
| 40 | + image_uri.to_file(path) |
| 41 | + end |
| 42 | + |
| 43 | + it "appends the correct extension when not provided" do |
| 44 | + expect(image_uri.to_file("image")).to eq("image.png") |
| 45 | + end |
| 46 | + |
| 47 | + it "does not modify the path when extension is provided" do |
| 48 | + expect(image_uri.to_file("image.png")).to eq("image.png") |
| 49 | + end |
| 50 | + |
| 51 | + it "uses .bin extension for unknown mime types" do |
| 52 | + unknown_data_uri = "data:image/unknown;base64,ABCDEF" |
| 53 | + image_uri = ImageDataUri.new(unknown_data_uri) |
| 54 | + expect(image_uri.to_file("image")).to eq("image.bin") |
| 55 | + end |
| 56 | + end |
| 57 | + |
| 58 | + describe "#to_file_data" do |
| 59 | + it "returns decoded file data" do |
| 60 | + image_uri = ImageDataURI.new(png_data_uri) |
| 61 | + expect(image_uri.to_file_data).to be_a(String) |
| 62 | + expect(image_uri.to_file_data.bytesize).to be > 0 |
| 63 | + end |
| 64 | + end |
| 65 | +end |
0 commit comments