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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
|
# frozen_string_literal: true
require "test_helper"
require "active_support/core_ext/securerandom"
module ActiveStorage::Service::SharedServiceTests
extend ActiveSupport::Concern
FIXTURE_DATA = (+"\211PNG\r\n\032\n\000\000\000\rIHDR\000\000\000\020\000\000\000\020\001\003\000\000\000%=m\"\000\000\000\006PLTE\000\000\000\377\377\377\245\331\237\335\000\000\0003IDATx\234c\370\377\237\341\377_\206\377\237\031\016\2603\334?\314p\1772\303\315\315\f7\215\031\356\024\203\320\275\317\f\367\201R\314\f\017\300\350\377\177\000Q\206\027(\316]\233P\000\000\000\000IEND\256B`\202").force_encoding(Encoding::BINARY)
included do
setup do
@key = SecureRandom.base58(24)
@service = self.class.const_get(:SERVICE)
@service.upload @key, StringIO.new(FIXTURE_DATA)
end
teardown do
@service.delete @key
end
test "uploading with integrity" do
key = SecureRandom.base58(24)
data = "Something else entirely!"
@service.upload(key, StringIO.new(data), checksum: Digest::MD5.base64digest(data))
assert_equal data, @service.download(key)
ensure
@service.delete key
end
test "uploading without integrity" do
key = SecureRandom.base58(24)
data = "Something else entirely!"
assert_raises(ActiveStorage::IntegrityError) do
@service.upload(key, StringIO.new(data), checksum: Digest::MD5.base64digest("bad data"))
end
assert_not @service.exist?(key)
ensure
@service.delete key
end
test "uploading with integrity and multiple keys" do
key = SecureRandom.base58(24)
data = "Something else entirely!"
@service.upload(
key,
StringIO.new(data),
checksum: Digest::MD5.base64digest(data),
filename: "racecar.jpg",
content_type: "image/jpg"
)
assert_equal data, @service.download(key)
ensure
@service.delete key
end
test "downloading" do
assert_equal FIXTURE_DATA, @service.download(@key)
end
test "downloading a nonexistent file" do
assert_raises(ActiveStorage::FileNotFoundError) do
@service.download(SecureRandom.base58(24))
end
end
test "downloading in chunks" do
key = SecureRandom.base58(24)
expected_chunks = [ "a" * 5.megabytes, "b" ]
actual_chunks = []
begin
@service.upload key, StringIO.new(expected_chunks.join)
@service.download key do |chunk|
actual_chunks << chunk
end
assert_equal expected_chunks, actual_chunks, "Downloaded chunks did not match uploaded data"
ensure
@service.delete key
end
end
test "downloading a nonexistent file in chunks" do
assert_raises(ActiveStorage::FileNotFoundError) do
@service.download(SecureRandom.base58(24)) { }
end
end
test "downloading partially" do
assert_equal "\x10\x00\x00", @service.download_chunk(@key, 19..21)
assert_equal "\x10\x00\x00", @service.download_chunk(@key, 19...22)
end
test "partially downloading a nonexistent file" do
assert_raises(ActiveStorage::FileNotFoundError) do
@service.download_chunk(SecureRandom.base58(24), 19..21)
end
end
test "existing" do
assert @service.exist?(@key)
assert_not @service.exist?(@key + "nonsense")
end
test "deleting" do
@service.delete @key
assert_not @service.exist?(@key)
end
test "deleting nonexistent key" do
assert_nothing_raised do
@service.delete SecureRandom.base58(24)
end
end
test "deleting by prefix" do
@service.upload("a/a/a", StringIO.new(FIXTURE_DATA))
@service.upload("a/a/b", StringIO.new(FIXTURE_DATA))
@service.upload("a/b/a", StringIO.new(FIXTURE_DATA))
@service.delete_prefixed("a/a/")
assert_not @service.exist?("a/a/a")
assert_not @service.exist?("a/a/b")
assert @service.exist?("a/b/a")
ensure
@service.delete("a/a/a")
@service.delete("a/a/b")
@service.delete("a/b/a")
end
end
end
|