|
116 | 116 | expect($result)->toEqual('MULTILINE="line1\nline2"'); |
117 | 117 | }); |
118 | 118 |
|
| 119 | +test('stringify leaves a value containing double quotes unquoted when nothing forces quoting', function () { |
| 120 | + $variables = [ |
| 121 | + ['key' => 'VITE_PAYMENT_METHODS_MOLLIE', 'value' => '["ideal","paybybank","bancontact"]'], |
| 122 | + ]; |
| 123 | + $result = EnvParser::stringify($variables); |
| 124 | + |
| 125 | + expect($result)->toEqual('VITE_PAYMENT_METHODS_MOLLIE=["ideal","paybybank","bancontact"]'); |
| 126 | +}); |
| 127 | + |
| 128 | +/** |
| 129 | + * @return array<string, array<int, string>> |
| 130 | + */ |
| 131 | +dataset('jsonArrayOnDiskProvider', function () { |
| 132 | + return [ |
| 133 | + 'bare' => ['VITE_PAYMENT_METHODS_MOLLIE=["ideal","paybybank","bancontact"]'], |
| 134 | + 'single quoted' => ["VITE_PAYMENT_METHODS_MOLLIE='[\"ideal\",\"paybybank\",\"bancontact\"]'"], |
| 135 | + 'already escaped' => ['VITE_PAYMENT_METHODS_MOLLIE="[\\"ideal\\",\\"paybybank\\",\\"bancontact\\"]"'], |
| 136 | + ]; |
| 137 | +}); |
| 138 | + |
| 139 | +test('saving rewrites every on disk form of a json array value as valid json', function (string $raw) { |
| 140 | + $parsed = EnvParser::parse($raw); |
| 141 | + |
| 142 | + expect($parsed)->toHaveCount(1); |
| 143 | + expect($parsed[0]['value'])->toEqual('["ideal","paybybank","bancontact"]'); |
| 144 | + expect(EnvParser::stringify($parsed))->toEqual('VITE_PAYMENT_METHODS_MOLLIE=["ideal","paybybank","bancontact"]'); |
| 145 | +})->with('jsonArrayOnDiskProvider'); |
| 146 | + |
| 147 | +test('stringify prefers single quotes over escaping double quotes', function () { |
| 148 | + $variables = [ |
| 149 | + ['key' => 'K', 'value' => 'he said "hi"'], |
| 150 | + ]; |
| 151 | + $result = EnvParser::stringify($variables); |
| 152 | + |
| 153 | + expect($result)->toEqual('K=\'he said "hi"\''); |
| 154 | +}); |
| 155 | + |
| 156 | +test('stringify keeps a mid string double quote unquoted', function () { |
| 157 | + $result = EnvParser::stringify([['key' => 'K', 'value' => 'x"y']]); |
| 158 | + |
| 159 | + expect($result)->toEqual('K=x"y'); |
| 160 | +}); |
| 161 | + |
| 162 | +test('stringify quotes values containing a hash', function () { |
| 163 | + $result = EnvParser::stringify([['key' => 'K', 'value' => '#fff']]); |
| 164 | + |
| 165 | + expect($result)->toEqual('K="#fff"'); |
| 166 | +}); |
| 167 | + |
| 168 | +test('stringify quotes a value that starts with a double quote', function () { |
| 169 | + $result = EnvParser::stringify([['key' => 'K', 'value' => '"hello"']]); |
| 170 | + |
| 171 | + expect($result)->toEqual('K=\'"hello"\''); |
| 172 | +}); |
| 173 | + |
| 174 | +test('stringify quotes a value that starts with a single quote', function () { |
| 175 | + $result = EnvParser::stringify([['key' => 'K', 'value' => "'hello'"]]); |
| 176 | + |
| 177 | + expect($result)->toEqual('K="\'hello\'"'); |
| 178 | +}); |
| 179 | + |
| 180 | +test('stringify escapes carriage returns rather than writing them raw', function () { |
| 181 | + $result = EnvParser::stringify([['key' => 'K', 'value' => "a\rb"]]); |
| 182 | + |
| 183 | + expect($result)->toEqual('K="a\rb"'); |
| 184 | + expect(EnvParser::parse($result)[0]['value'])->toEqual("a\rb"); |
| 185 | +}); |
| 186 | + |
| 187 | +test('stringify does not single quote a carriage return value', function () { |
| 188 | + $result = EnvParser::stringify([['key' => 'K', 'value' => "a\rb\"c"]]); |
| 189 | + |
| 190 | + expect($result)->toEqual('K="a\rb\"c"'); |
| 191 | + expect(EnvParser::parse($result)[0]['value'])->toEqual("a\rb\"c"); |
| 192 | +}); |
| 193 | + |
| 194 | +test('stringify escapes when both quote styles are present', function () { |
| 195 | + $result = EnvParser::stringify([['key' => 'K', 'value' => 'it\'s "quoted"']]); |
| 196 | + |
| 197 | + expect($result)->toEqual('K="it\'s \\"quoted\\""'); |
| 198 | +}); |
| 199 | + |
119 | 200 | test('stringify skips empty keys', function () { |
120 | 201 | $variables = [ |
121 | 202 | ['key' => '', 'value' => 'empty'], |
|
155 | 236 | 'empty' => [''], |
156 | 237 | 'base64 padding' => ['base64:abc=123='], |
157 | 238 | 'backslash and quote' => ['C:\dir "x"'], |
| 239 | + 'json array' => ['["ideal","paybybank","bancontact"]'], |
| 240 | + 'leading double quote' => ['"hello"'], |
| 241 | + 'leading single quote' => ["'hello'"], |
| 242 | + 'tab' => ["a\tb"], |
| 243 | + 'trailing tab' => ["a\t"], |
| 244 | + 'carriage return' => ["a\rb"], |
| 245 | + 'carriage return with double quote' => ["a\rb\"c"], |
158 | 246 | ]; |
159 | 247 | }); |
160 | 248 |
|
|
0 commit comments