agentskills.codes
TE

test-api-serializer

Serializer tests: to_representation, to_internal_value, validation. Use when: testing DRF serializer output, input validation, custom field logic.

Install

mkdir -p .claude/skills/test-api-serializer && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/15123" && unzip -o skill.zip -d .claude/skills/test-api-serializer && rm skill.zip

Installs to .claude/skills/test-api-serializer

Activation

This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.

Serializer tests: to_representation, to_internal_value, validation. Use when: testing DRF serializer output, input validation, custom field logic.
146 chars✓ has a “when” trigger

About this skill

API Serializer Tests

When to Use

  • Testing serializer output matches expected JSON structure
  • Verifying serializer validation rejects bad input
  • Testing custom to_representation / to_internal_value
  • Checking nested serializer behavior

Rules

Testing Serialization Output

import pytest

@pytest.mark.django_db
def test_serializer_output():
    from tests.factories import FirmwareFactory
    from apps.firmwares.serializers import FirmwareSerializer
    fw = FirmwareFactory(version="1.0.0")
    serializer = FirmwareSerializer(fw)
    data = serializer.data
    assert data["version"] == "1.0.0"
    assert "id" in data
    assert "created_at" in data

@pytest.mark.django_db
def test_serializer_excludes_sensitive():
    from tests.factories import UserFactory
    from apps.users.serializers import UserSerializer
    user = UserFactory()
    data = UserSerializer(user).data
    assert "password" not in data
    assert "email" in data

Testing Deserialization (Input Validation)

@pytest.mark.django_db
def test_serializer_valid_input():
    from apps.firmwares.serializers import FirmwareSerializer
    data = {"version": "1.0.0", "build_number": "100"}
    serializer = FirmwareSerializer(data=data)
    assert serializer.is_valid(), serializer.errors

@pytest.mark.django_db
def test_serializer_invalid_input():
    from apps.firmwares.serializers import FirmwareSerializer
    serializer = FirmwareSerializer(data={})
    assert not serializer.is_valid()
    assert "version" in serializer.errors

@pytest.mark.django_db
@pytest.mark.parametrize("field,value", [
    ("version", ""),
    ("version", None),
    ("file_size", -1),
])
def test_serializer_field_validation(field, value):
    from apps.firmwares.serializers import FirmwareSerializer
    serializer = FirmwareSerializer(data={field: value})
    assert not serializer.is_valid()
    assert field in serializer.errors

Testing Custom Validation

@pytest.mark.django_db
def test_serializer_validate_method():
    from apps.firmwares.serializers import FirmwareSerializer
    data = {"version": "1.0.0", "min_android": "15", "max_android": "10"}
    serializer = FirmwareSerializer(data=data)
    assert not serializer.is_valid()
    assert "non_field_errors" in serializer.errors

Testing Read-Only Fields

@pytest.mark.django_db
def test_read_only_field_ignored():
    from apps.firmwares.serializers import FirmwareSerializer
    data = {"version": "1.0.0", "download_count": 999}
    serializer = FirmwareSerializer(data=data)
    if serializer.is_valid():
        obj = serializer.save()
        assert obj.download_count != 999  # Read-only, should be default

Testing Nested Serializers

@pytest.mark.django_db
def test_nested_serializer():
    from tests.factories import FirmwareFactory
    from apps.firmwares.serializers import FirmwareDetailSerializer
    fw = FirmwareFactory()
    data = FirmwareDetailSerializer(fw).data
    assert "model" in data
    assert "brand" in data["model"]

Red Flags

  • Not testing both serialization and deserialization directions
  • Missing validation tests for required fields
  • Testing serializer through views instead of directly — harder to debug
  • Not checking serializer.errors content — just checking is_valid() is weak

Quality Gate

& .\.venv\Scripts\python.exe -m ruff check . --fix
& .\.venv\Scripts\python.exe -m ruff format .
& .\.venv\Scripts\python.exe manage.py check --settings=app.settings_dev

Search skills

Search the agent skills registry