|
28 | 28 | expect($webhookCall)->toBeInstanceOf(WebhookCall::class); |
29 | 29 | expect($webhookCall->name)->toBe('test'); |
30 | 30 | expect($webhookCall->payload)->toBe(['key' => 'value']); |
31 | | - expect($webhookCall->payload)->not->toHaveKey('attachments'); |
| 31 | + expect($webhookCall->attachments)->toBeNull(); |
32 | 32 | }); |
33 | 33 |
|
34 | 34 | it('can store webhook with single file', function () { |
|
43 | 43 |
|
44 | 44 | expect($webhookCall)->toBeInstanceOf(WebhookCall::class); |
45 | 45 | expect($webhookCall->name)->toBe('test'); |
46 | | - expect($webhookCall->payload['key'])->toBe('value'); |
47 | | - expect($webhookCall->payload)->toHaveKey('attachments'); |
48 | | - expect($webhookCall->payload['attachments'])->toHaveCount(1); |
| 46 | + expect($webhookCall->payload)->toBe(['key' => 'value']); |
| 47 | + expect($webhookCall->payload)->not->toHaveKey('attachments'); |
| 48 | + expect($webhookCall->attachments)->toHaveCount(1); |
49 | 49 |
|
50 | | - $attachment = $webhookCall->payload['attachments'][0]; |
| 50 | + $attachment = $webhookCall->attachments[0]; |
51 | 51 | expect($attachment['originalName'])->toBe('test.txt'); |
52 | 52 | expect($attachment['mimeType'])->not->toBeEmpty(); |
53 | 53 | expect($attachment['size'])->toBeGreaterThan(0); |
|
66 | 66 | $webhookCall = WebhookCall::storeWebhook($this->webhookConfig, $request); |
67 | 67 |
|
68 | 68 | expect($webhookCall)->toBeInstanceOf(WebhookCall::class); |
69 | | - expect($webhookCall->payload)->toHaveKey('attachments'); |
70 | | - expect($webhookCall->payload['attachments'])->toHaveCount(2); |
| 69 | + expect($webhookCall->attachments)->toHaveCount(2); |
71 | 70 |
|
72 | | - $attachment1 = $webhookCall->payload['attachments'][0]; |
| 71 | + $attachment1 = $webhookCall->attachments[0]; |
73 | 72 | expect($attachment1['originalName'])->toBe('test1.txt'); |
74 | 73 | expect($attachment1['size'])->toBeGreaterThan(0); |
75 | 74 |
|
76 | | - $attachment2 = $webhookCall->payload['attachments'][1]; |
| 75 | + $attachment2 = $webhookCall->attachments[1]; |
77 | 76 | expect($attachment2['originalName'])->toBe('test2.pdf'); |
78 | 77 | expect($attachment2['size'])->toBeGreaterThan(0); |
79 | 78 | }); |
|
92 | 91 | $webhookCall = WebhookCall::storeWebhook($this->webhookConfig, $request); |
93 | 92 |
|
94 | 93 | expect($webhookCall)->toBeInstanceOf(WebhookCall::class); |
95 | | - expect($webhookCall->payload)->toHaveKey('attachments'); |
96 | | - expect($webhookCall->payload['attachments'])->toHaveCount(3); |
| 94 | + expect($webhookCall->attachments)->toHaveCount(3); |
97 | 95 |
|
98 | | - $fileNames = collect($webhookCall->payload['attachments'])->pluck('originalName')->toArray(); |
| 96 | + $fileNames = collect($webhookCall->attachments)->pluck('originalName')->toArray(); |
99 | 97 | expect($fileNames)->toContain('single.txt'); |
100 | 98 | expect($fileNames)->toContain('multi1.txt'); |
101 | 99 | expect($fileNames)->toContain('multi2.txt'); |
102 | 100 | }); |
103 | 101 |
|
| 102 | +it('does not overwrite a user-provided attachments key in the payload', function () { |
| 103 | + $request = Request::create('/test', 'POST', [ |
| 104 | + 'key' => 'value', |
| 105 | + 'attachments' => ['user-provided', 'data'], |
| 106 | + ]); |
| 107 | + |
| 108 | + $webhookCall = WebhookCall::storeWebhook($this->webhookConfig, $request); |
| 109 | + |
| 110 | + expect($webhookCall->payload['attachments'])->toBe(['user-provided', 'data']); |
| 111 | + expect($webhookCall->attachments)->toBeNull(); |
| 112 | +}); |
| 113 | + |
| 114 | +it('preserves a user-provided attachments key when files are also uploaded', function () { |
| 115 | + Storage::fake('local'); |
| 116 | + |
| 117 | + $file = UploadedFile::fake()->create('test.txt', 1); |
| 118 | + |
| 119 | + $request = Request::create('/test', 'POST', [ |
| 120 | + 'attachments' => ['user-provided'], |
| 121 | + ]); |
| 122 | + $request->files->set('document', $file); |
| 123 | + |
| 124 | + $webhookCall = WebhookCall::storeWebhook($this->webhookConfig, $request); |
| 125 | + |
| 126 | + expect($webhookCall->payload['attachments'])->toBe(['user-provided']); |
| 127 | + expect($webhookCall->attachments)->toHaveCount(1); |
| 128 | + expect($webhookCall->attachments[0]['originalName'])->toBe('test.txt'); |
| 129 | +}); |
| 130 | + |
| 131 | +it('does not extract files when store_attachments is disabled', function () { |
| 132 | + Storage::fake('local'); |
| 133 | + |
| 134 | + $config = new WebhookConfig([ |
| 135 | + 'name' => 'test', |
| 136 | + 'signing_secret' => 'secret', |
| 137 | + 'signature_header_name' => 'Signature', |
| 138 | + 'signature_validator' => \Spatie\WebhookClient\SignatureValidator\DefaultSignatureValidator::class, |
| 139 | + 'webhook_profile' => \Spatie\WebhookClient\WebhookProfile\ProcessEverythingWebhookProfile::class, |
| 140 | + 'webhook_response' => \Spatie\WebhookClient\WebhookResponse\DefaultRespondsTo::class, |
| 141 | + 'webhook_model' => WebhookCall::class, |
| 142 | + 'process_webhook_job' => \Spatie\WebhookClient\Tests\TestClasses\ProcessWebhookJobTestClass::class, |
| 143 | + 'store_headers' => [], |
| 144 | + 'store_attachments' => false, |
| 145 | + ]); |
| 146 | + |
| 147 | + $file = UploadedFile::fake()->create('test.txt', 1); |
| 148 | + $request = Request::create('/test', 'POST', ['key' => 'value']); |
| 149 | + $request->files->set('document', $file); |
| 150 | + |
| 151 | + $webhookCall = WebhookCall::storeWebhook($config, $request); |
| 152 | + |
| 153 | + expect($webhookCall->attachments)->toBeNull(); |
| 154 | + expect($webhookCall->payload)->not->toHaveKey('attachments'); |
| 155 | +}); |
| 156 | + |
104 | 157 | it('can retrieve attachments as uploaded file objects', function () { |
105 | 158 | Storage::fake('local'); |
106 | 159 |
|
|
128 | 181 | expect($attachments)->toBeEmpty(); |
129 | 182 | }); |
130 | 183 |
|
| 184 | +it('falls back to payload attachments for rows written by older versions', function () { |
| 185 | + $legacyAttachment = [ |
| 186 | + 'originalName' => 'legacy.txt', |
| 187 | + 'mimeType' => 'text/plain', |
| 188 | + 'size' => 7, |
| 189 | + 'error' => 0, |
| 190 | + 'path' => '/tmp/legacy', |
| 191 | + 'content' => base64_encode('legacy!'), |
| 192 | + ]; |
| 193 | + |
| 194 | + $webhookCall = WebhookCall::create([ |
| 195 | + 'name' => 'test', |
| 196 | + 'url' => 'http://example.test/webhook', |
| 197 | + 'headers' => [], |
| 198 | + 'payload' => ['key' => 'value', 'attachments' => [$legacyAttachment]], |
| 199 | + 'attachments' => null, |
| 200 | + 'exception' => null, |
| 201 | + ]); |
| 202 | + |
| 203 | + $attachments = $webhookCall->getAttachments(); |
| 204 | + |
| 205 | + expect($attachments)->toHaveCount(1); |
| 206 | + expect($attachments[0])->toBeInstanceOf(UploadedFile::class); |
| 207 | + expect($attachments[0]->getClientOriginalName())->toBe('legacy.txt'); |
| 208 | + expect(file_get_contents($attachments[0]->getPathname()))->toBe('legacy!'); |
| 209 | +}); |
| 210 | + |
| 211 | +it('prefers the attachments column over a payload attachments key when both exist', function () { |
| 212 | + $columnAttachment = [ |
| 213 | + 'originalName' => 'column.txt', |
| 214 | + 'mimeType' => 'text/plain', |
| 215 | + 'size' => 6, |
| 216 | + 'error' => 0, |
| 217 | + 'path' => '/tmp/column', |
| 218 | + 'content' => base64_encode('column'), |
| 219 | + ]; |
| 220 | + |
| 221 | + $webhookCall = WebhookCall::create([ |
| 222 | + 'name' => 'test', |
| 223 | + 'url' => 'http://example.test/webhook', |
| 224 | + 'headers' => [], |
| 225 | + 'payload' => ['attachments' => ['user-provided']], |
| 226 | + 'attachments' => [$columnAttachment], |
| 227 | + 'exception' => null, |
| 228 | + ]); |
| 229 | + |
| 230 | + $attachments = $webhookCall->getAttachments(); |
| 231 | + |
| 232 | + expect($attachments)->toHaveCount(1); |
| 233 | + expect($attachments[0]->getClientOriginalName())->toBe('column.txt'); |
| 234 | +}); |
| 235 | + |
131 | 236 | it('can retrieve multiple attachments as uploaded file objects', function () { |
132 | 237 | Storage::fake('local'); |
133 | 238 |
|
|
0 commit comments