import enum import json import typing as tp import unittest from satella.json import JSONAble, json_encode, read_json_from_file, write_json_to_file, \ write_json_to_file_if_different, JSONEncoder, JSONAbleDataObject class TestJson(unittest.TestCase): def test_jsonable_data_object(self): class CultureContext(JSONAbleDataObject): units: str = 'metric' timezone: str language: str a = CultureContext(language='pl', timezone='Europe/Warsaw') self.assertEqual(a.to_json(), {'language': 'pl', 'timezone': 'Europe/Warsaw', 'units': 'metric'}) self.assertEqual(CultureContext.from_json(a.to_json()), a) self.assertEqual(hash(CultureContext.from_json(a.to_json())), hash(a)) def test_json_encoder_enums(self): enc = JSONEncoder() class Enum(enum.Enum): A = 'test' b = enc.encode(Enum.A) self.assertEqual(b, '"test"') write_json_to_file('test3.json', Enum.A) def test_write_json_to_file_if_different(self): d = {'test': 4} self.assertTrue(write_json_to_file_if_different('test2.json', d)) self.assertFalse(write_json_to_file_if_different('test2.json', d)) d = {'test': 5} self.assertTrue(write_json_to_file_if_different('test2.json', d)) self.assertFalse(write_json_to_file_if_different('test2.json', d)) def test_load_json_from_file(self): d = {'test': 2} write_json_to_file('test.json', d) self.assertEqual(read_json_from_file('test.json'), d) def test_jsonable_objects(self): class MyClass(JSONAble): def to_json(self) -> tp.Union[list, dict, str, int, float, None]: return [] self.assertEqual(json_encode(MyClass()), '[]') def test_unjsonable_objects(self): class MyClass: def __init__(self, a): self.a = a data = json.loads(json_encode(MyClass(5))) self.assertEqual(data['a'], 5) class MyClass2: __slots__ = ('a', 'b') def __init__(self, a): self.a = a self.b = {'test': 'test2'} data = json.loads(json_encode(MyClass2(5))) self.assertEqual(data['a'], 5) self.assertEqual(data['b']['test'], 'test2')