Support default values being used for empty HTML fields. Closes #3130. · encode/django-rest-framework@d231f36 (original) (raw)

`@@ -4,6 +4,7 @@

`

4

4

``

5

5

`import django

`

6

6

`import pytest

`

``

7

`+

from django.http import QueryDict

`

7

8

`from django.utils import timezone

`

8

9

``

9

10

`import rest_framework

`

`@@ -224,14 +225,6 @@ def test_invalid_error_key(self):

`

224

225

`assert str(exc_info.value) == expected

`

225

226

``

226

227

``

227

``

`-

class MockHTMLDict(dict):

`

228

``

`-

"""

`

229

``

`-

This class mocks up a dictionary like object, that behaves

`

230

``

`-

as if it was returned for multipart or urlencoded data.

`

231

``

`-

"""

`

232

``

`-

getlist = None

`

233

``

-

234

``

-

235

228

`class TestBooleanHTMLInput:

`

236

229

`def setup(self):

`

237

230

`class TestSerializer(serializers.Serializer):

`

`@@ -245,7 +238,7 @@ def test_empty_html_checkbox(self):

`

245

238

` """

`

246

239

`# This class mocks up a dictionary like object, that behaves

`

247

240

`# as if it was returned for multipart or urlencoded data.

`

248

``

`-

serializer = self.Serializer(data=MockHTMLDict())

`

``

241

`+

serializer = self.Serializer(data=QueryDict(''))

`

249

242

`assert serializer.is_valid()

`

250

243

`assert serializer.validated_data == {'archived': False}

`

251

244

``

`@@ -255,39 +248,63 @@ def test_empty_html_charfield(self):

`

255

248

`class TestSerializer(serializers.Serializer):

`

256

249

`message = serializers.CharField(default='happy')

`

257

250

``

258

``

`-

serializer = TestSerializer(data=MockHTMLDict())

`

``

251

`+

serializer = TestSerializer(data=QueryDict(''))

`

259

252

`assert serializer.is_valid()

`

260

253

`assert serializer.validated_data == {'message': 'happy'}

`

261

254

``

``

255

`+

def test_empty_html_integerfield(self):

`

``

256

`+

class TestSerializer(serializers.Serializer):

`

``

257

`+

message = serializers.IntegerField(default=123)

`

``

258

+

``

259

`+

serializer = TestSerializer(data=QueryDict('message='))

`

``

260

`+

assert serializer.is_valid()

`

``

261

`+

assert serializer.validated_data == {'message': 123}

`

``

262

+

``

263

`+

def test_empty_html_uuidfield_with_default(self):

`

``

264

`+

class TestSerializer(serializers.Serializer):

`

``

265

`+

message = serializers.UUIDField(default=uuid.uuid4)

`

``

266

+

``

267

`+

serializer = TestSerializer(data=QueryDict('message='))

`

``

268

`+

assert serializer.is_valid()

`

``

269

`+

assert list(serializer.validated_data.keys()) == ['message']

`

``

270

+

``

271

`+

def test_empty_html_uuidfield_with_optional(self):

`

``

272

`+

class TestSerializer(serializers.Serializer):

`

``

273

`+

message = serializers.UUIDField(required=False)

`

``

274

+

``

275

`+

serializer = TestSerializer(data=QueryDict('message='))

`

``

276

`+

assert serializer.is_valid()

`

``

277

`+

assert list(serializer.validated_data.keys()) == []

`

``

278

+

262

279

`def test_empty_html_charfield_allow_null(self):

`

263

280

`class TestSerializer(serializers.Serializer):

`

264

281

`message = serializers.CharField(allow_null=True)

`

265

282

``

266

``

`-

serializer = TestSerializer(data=MockHTMLDict({'message': ''}))

`

``

283

`+

serializer = TestSerializer(data=QueryDict('message='))

`

267

284

`assert serializer.is_valid()

`

268

285

`assert serializer.validated_data == {'message': None}

`

269

286

``

270

287

`def test_empty_html_datefield_allow_null(self):

`

271

288

`class TestSerializer(serializers.Serializer):

`

272

289

`expiry = serializers.DateField(allow_null=True)

`

273

290

``

274

``

`-

serializer = TestSerializer(data=MockHTMLDict({'expiry': ''}))

`

``

291

`+

serializer = TestSerializer(data=QueryDict('expiry='))

`

275

292

`assert serializer.is_valid()

`

276

293

`assert serializer.validated_data == {'expiry': None}

`

277

294

``

278

295

`def test_empty_html_charfield_allow_null_allow_blank(self):

`

279

296

`class TestSerializer(serializers.Serializer):

`

280

297

`message = serializers.CharField(allow_null=True, allow_blank=True)

`

281

298

``

282

``

`-

serializer = TestSerializer(data=MockHTMLDict({'message': ''}))

`

``

299

`+

serializer = TestSerializer(data=QueryDict('message='))

`

283

300

`assert serializer.is_valid()

`

284

301

`assert serializer.validated_data == {'message': ''}

`

285

302

``

286

303

`def test_empty_html_charfield_required_false(self):

`

287

304

`class TestSerializer(serializers.Serializer):

`

288

305

`message = serializers.CharField(required=False)

`

289

306

``

290

``

`-

serializer = TestSerializer(data=MockHTMLDict())

`

``

307

`+

serializer = TestSerializer(data=QueryDict(''))

`

291

308

`assert serializer.is_valid()

`

292

309

`assert serializer.validated_data == {}

`

293

310

``

`@@ -1116,8 +1133,6 @@ class TestMultipleChoiceField(FieldValues):

`

1116

1133

` )

`

1117

1134

``

1118

1135

`def test_against_partial_and_full_updates(self):

`

1119

``

`-

serializer = self.Serializer(data=MockHTMLDict())

`

1120

``

`-

from django.http import QueryDict

`

1121

1136

`field = serializers.MultipleChoiceField(choices=(('a', 'a'), ('b', 'b')))

`

1122

1137

`field.partial = False

`

1123

1138

`assert field.get_value(QueryDict({})) == []

`