File: composite_io_spec.rb

package info (click to toggle)
ruby-http-form-data 2.3.0-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 204 kB
  • sloc: ruby: 861; makefile: 5
file content (109 lines) | stat: -rw-r--r-- 3,186 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# frozen_string_literal: true

RSpec.describe HTTP::FormData::CompositeIO do
  subject(:composite_io) { HTTP::FormData::CompositeIO.new(ios) }

  let(:ios) { ["Hello", " ", "", "world", "!"].map { |s| StringIO.new(s) } }

  describe "#initialize" do
    it "accepts IOs and strings" do
      io = HTTP::FormData::CompositeIO.new(["Hello ", StringIO.new("world!")])
      expect(io.read).to eq "Hello world!"
    end

    it "fails if an IO is neither a String nor an IO" do
      expect { HTTP::FormData::CompositeIO.new %i[hello world] }
        .to raise_error(ArgumentError)
    end
  end

  describe "#read" do
    it "reads all data" do
      expect(composite_io.read).to eq "Hello world!"
    end

    it "reads partial data" do
      expect(composite_io.read(3)).to eq "Hel"
      expect(composite_io.read(2)).to eq "lo"
      expect(composite_io.read(1)).to eq " "
      expect(composite_io.read(6)).to eq "world!"
    end

    it "returns empty string when no data was retrieved" do
      composite_io.read
      expect(composite_io.read).to eq ""
    end

    it "returns nil when no partial data was retrieved" do
      composite_io.read
      expect(composite_io.read(3)).to eq nil
    end

    it "reads partial data with a buffer" do
      outbuf = String.new
      expect(composite_io.read(3, outbuf)).to eq "Hel"
      expect(composite_io.read(2, outbuf)).to eq "lo"
      expect(composite_io.read(1, outbuf)).to eq " "
      expect(composite_io.read(6, outbuf)).to eq "world!"
    end

    it "fills the buffer with retrieved content" do
      outbuf = String.new
      composite_io.read(3, outbuf)
      expect(outbuf).to eq "Hel"
      composite_io.read(2, outbuf)
      expect(outbuf).to eq "lo"
      composite_io.read(1, outbuf)
      expect(outbuf).to eq " "
      composite_io.read(6, outbuf)
      expect(outbuf).to eq "world!"
    end

    it "returns nil when no partial data was retrieved with a buffer" do
      outbuf = String.new("content")
      composite_io.read
      expect(composite_io.read(3, outbuf)).to eq nil
      expect(outbuf).to eq ""
    end

    it "returns data in binary encoding" do
      io = HTTP::FormData::CompositeIO.new(%w[Janko Marohnić])

      expect(io.read(5).encoding).to eq Encoding::BINARY
      expect(io.read(9).encoding).to eq Encoding::BINARY

      io.rewind
      expect(io.read.encoding).to eq Encoding::BINARY
      expect(io.read.encoding).to eq Encoding::BINARY
    end

    it "reads data in bytes" do
      emoji = "😃"
      io = HTTP::FormData::CompositeIO.new([emoji])

      expect(io.read(1)).to eq emoji.b[0]
      expect(io.read(1)).to eq emoji.b[1]
      expect(io.read(1)).to eq emoji.b[2]
      expect(io.read(1)).to eq emoji.b[3]
    end
  end

  describe "#rewind" do
    it "rewinds all IOs" do
      composite_io.read
      composite_io.rewind
      expect(composite_io.read).to eq "Hello world!"
    end
  end

  describe "#size" do
    it "returns sum of all IO sizes" do
      expect(composite_io.size).to eq 12
    end

    it "returns 0 when there are no IOs" do
      empty_composite_io = HTTP::FormData::CompositeIO.new []
      expect(empty_composite_io.size).to eq 0
    end
  end
end