Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

JSONSnapshotExtension None is serialized as "None" instead of null #622

Closed
willhoyle opened this issue Sep 25, 2022 · 2 comments · Fixed by #672
Closed

JSONSnapshotExtension None is serialized as "None" instead of null #622

willhoyle opened this issue Sep 25, 2022 · 2 comments · Fixed by #672
Assignees
Labels
breaking change feature request New feature or request released serializer Syrupy serializer question

Comments

@willhoyle
Copy link

Is it intended behaviour that None is not translated to null with the JSONSnapshotExtension?

@pytest.fixture
def snapshot_json(snapshot):
    return snapshot.use_extension(JSONSnapshotExtension)

def test_output(snapshot_json):
    assert {"x": None} == snapshot_json()

Actual Output:

{
    "x": "None"
}

Expected Output:

{
    "x": null
}

Digging into the code, it looks like there's no handling of None in _filter, and it eventually reaches return repr(None) line.

I can wrap the existing class with the following code:

import pytest
from syrupy.extensions.json import JSONSnapshotExtension

@pytest.fixture
def snapshot_json(snapshot):
    class CustomJSONExtension(JSONSnapshotExtension):
        @classmethod
        def _filter(
            cls,
            data,
            **kwargs
        ):
            if data is None:
                return data
            else:
                return super()._filter(data, **kwargs)

    return snapshot.use_extension(CustomJSONExtension)

Was wondering if there's a different way to get this behaviour?

@noahnu noahnu added feature request New feature or request breaking change serializer Syrupy serializer question labels Sep 25, 2022
@noahnu noahnu added this to the v4.0.0 - Performance milestone Sep 25, 2022
@noahnu
Copy link
Collaborator

noahnu commented Sep 25, 2022

I think this was overlooked when the serializer was introduced. I agree with you that null makes sense for the None type.

Since this is a change to serialization, it'd be a breaking change, so we can add this to the next breaking change release, which is the v4 release.

If you're interested in putting up a PR, it'd be against the "next" branch.

@noahnu noahnu self-assigned this Dec 30, 2022
@noahnu noahnu linked a pull request Dec 30, 2022 that will close this issue
@noahnu noahnu closed this as completed in c330680 Feb 2, 2023
tophat-opensource-bot pushed a commit that referenced this issue Feb 2, 2023
# [4.0.0](v3.0.6...v4.0.0) (2023-02-02)

### Bug Fixes

* defer snapshot writes until end of session ([#606](#606)) ([68f1d5f](68f1d5f))
* ensure all pytest options are serializable ([#667](#667)) ([e8ed9f2](e8ed9f2))
* improve pytest-xdist compatibility ([9b9090f](9b9090f))
* lru_cache on snapshot reads ([#629](#629)) ([c1a675f](c1a675f))
* remove legacy path usage to support no:legacypath, closes [#677](#677) ([#684](#684)) ([6385979](6385979))

### Code Refactoring

* simplify data serializer for ambr ([#676](#676)) ([3d296e1](3d296e1))
* write performance improvements, api clarity ([#645](#645)) ([2c31c39](2c31c39))

### Features

* **json:** serialize None as null, close [#622](#622) ([c330680](c330680))
* numerically sort snapshots if possible, close [#657](#657) ([4ca0716](4ca0716))
* **serializer:** preserve key ordering of OrderedDict ([0a2289a](0a2289a))
* support overriding the amber serializer class ([#683](#683)) ([662c93f](662c93f))
* update python version, pytest version ([#658](#658)) ([c360b95](c360b95))

### BREAKING CHANGES

* Serializers may now throw a TaintedSnapshotError which will tell the user to regenerate the snapshot even if the underlying data has not changed. This is to support rolling out more subtle changes to the serializers, such as the introduction of serializer metadata.
* Renamed DataSerializer to AmberDataSerializer.
* **serializer:** Key order is now preserved if using OrderedDict in both the Amber serializer and JSON serializer.
* **json:** The JSONSnapshotExtension now serializes Python's None as "null" rather than "None".
* Raise minimum python version to 3.8.1 and min. pytest version to v7.
* PyTestLocation.filename has been renamed to .basename

* refactor: add test_location kwarg to get_snapshot_name

* refactor: get_snapshot_name is now static as a classmethod

* refactor: remove pre and post read/write hooks
* Pre and post read/write hooks have been removed without replacement to make internal refactor simpler. Please open a GitHub issue if you have a use case for these hooks.

* refactor: rename Fossil to Collection
* The term 'fossil' has been replaced by the clearer term 'collection'.

* refactor: pass test_location to read_snapshot

* refactor: remove singular write_snapshot method

* refactor: dirname property to method

* refactor: pass test_location to discover_snapshots

* refactor: remove usage of self.test_location

* refactor: make write_snapshot a classmethod

* refactor: do not instantiate extension with test_location
* Numerous instance methods have been refactored as classmethods.
@tophat-opensource-bot
Copy link
Contributor

🎉 This issue has been resolved in version 4.0.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
breaking change feature request New feature or request released serializer Syrupy serializer question
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants