File: reader_test.rb

package info (click to toggle)
ruby-multipart-parser 0.1.1-4
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, forky, sid, trixie
  • size: 128 kB
  • sloc: ruby: 602; makefile: 4
file content (117 lines) | stat: -rw-r--r-- 3,104 bytes parent folder | download
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
110
111
112
113
114
115
116
117
require 'test/unit'
require "multipart_parser/reader"
require File.dirname(__FILE__) + "/../fixtures/multipart"

module MultipartParser
  class ReaderTest < Test::Unit::TestCase
    def test_extract_boundary_value
      assert_raise(NotMultipartError) do
        not_multipart = "text/plain"
        Reader.extract_boundary_value(not_multipart)
      end

      assert_raise(NotMultipartError) do
        no_boundary = "multipart/form-data"
        Reader.extract_boundary_value(no_boundary)
      end

      valid_content_type = "multipart/form-data; boundary=9asdadsdfv"
      boundary = Reader.extract_boundary_value(valid_content_type)
      assert_equal "9asdadsdfv", boundary
    end

    def test_error_callback
      on_error_called = false
      reader = Reader.new("boundary")
      reader.on_error do |err|
        on_error_called = true
      end
      reader.write("not boundary atleast")
      assert on_error_called
    end

    def test_success_scenario
      fixture = Fixtures::Rfc1867.new
      reader = Reader.new(fixture.boundary)
      on_error_called = false
      parts = {}

      reader.on_error do |err|
        on_error_called = true
      end

      reader.on_part do |part|
        part_entry = {:part => part, :data => '', :ended => false}
        parts[part.name] = part_entry
        part.on_data do |data|
          part_entry[:data] << data
        end
        part.on_end do
          part_entry[:ended] = true
        end
      end

      reader.write(fixture.raw)

      assert !on_error_called
      assert reader.ended?

      assert_equal parts.size, fixture.parts.size
      assert parts.all? {|k, v| v[:ended]}

      field = parts['field1']
      assert !field.nil?
      assert_equal 'field1', field[:part].name
      assert_equal fixture.parts.first[:data], field[:data]

      file = parts['pics']
      assert !file.nil?
      assert_equal 'pics', file[:part].name
      assert_equal 'file1.txt', file[:part].filename
      assert_equal fixture.parts.last[:data], file[:data]
    end

    <<-FAILING_TEST

    The following test is failing since it has been introduced
    in upstream commit fa18f46d7. It should be fixed, but for
    now it'll do.

    def test_long
      fixture = Fixtures::LongBoundary.new
      reader = Reader.new(fixture.boundary)
      on_error_called = false
      parts = {}

      reader.on_error do |err|
        on_error_called = true
      end

      reader.on_part do |part|
        part_entry = {:part => part, :data => '', :ended => false}
        parts[part.name] = part_entry
        part.on_data do |data|
          part_entry[:data] << data
        end
        part.on_end do
          part_entry[:ended] = true
        end
      end

      reader.write(fixture.raw)

      assert !on_error_called
      assert reader.ended?

      assert_equal parts.size, fixture.parts.size
      assert parts.all? {|k, v| v[:ended]}

      field = parts['field1']
      assert !field.nil?
      assert_equal 'field1', field[:part].name
      assert_equal fixture.parts.first[:data], field[:data]
    end

    FAILING_TEST
  end
end