def test_get_configs_strip_value_or_not(): configs = GConfigs(backend=DummyBackend) assert configs.strip # strip default: True assert ( configs(" white space key ") == "white space value" and configs("space-only-value") == "" ), "Returning value should be stripped." # override default assert ( configs(" white space key ", strip=False) == " white space value " and configs("space-only-value", strip=False) == " " ), "Returning value should ALLOW blank spaces." # no strip configs2 = GConfigs(backend=DummyBackend, strip=False) assert configs2.strip is False # strip default: False assert ( configs2(" white space key ") == " white space value " and configs2("space-only-value") == " " ), "Returning value should ALLOW blank spaces." # override default assert ( configs2(" white space key ", strip=True) == "white space value" and configs2("space-only-value", strip=True) == "" ), "Returning value should be stripped." configs2.strip = True assert configs2.strip
def test_basics(): # main endpoints gconfigs.envs gconfigs.dotenvs gconfigs.configs gconfigs.secrets # basic expected configs_ = GConfigs(backend=DummyBackend) configs_.strip configs_.object_type_name configs_.get configs_.__call__ # iterator configs_.iterator configs_.__next__ configs_.__iter__ # fancy xD configs_.json configs_.__contains__ configs_.__len__ configs_.__repr__ assert ( configs_.object_type_name == "KeyValue" ), "'object_type_name' default value should be 'KeyValue'" assert configs_.strip, "'strip' default value should be boolean 'True'" configs = GConfigs(backend=DummyBackend, object_type_name="DummyConfig") assert configs.object_type_name == "DummyConfig" configs.object_type_name = "DummyConfigChanged" assert configs.object_type_name == "DummyConfigChanged"
def test_json(): configs = GConfigs(backend=DummyBackend) json_ = configs.json() assert json_ # let's turn the json_ into a dict so we can see if it preserved all the configs configs_data = json.loads(json_) assert all(key in configs._backend.data for key in configs_data) assert next( configs ), "If `configs` is not iterable after `configs.json()` it's because it's not using the iterator properly."
def test_bad_instatiation(): class MissingGet: pass class MissingKeys: pass with pytest.raises(AttributeError): GConfigs(backend=MissingGet) with pytest.raises(AttributeError): GConfigs(backend=MissingKeys) with pytest.raises(TypeError, match=r".*required positional argument: 'backend'.*"): GConfigs()
def test_get_configs_use_instead(): configs = GConfigs(backend=DummyBackend) # First key doesn't exist, use key/config "CONFIG-1" instead assert configs("NON-EXISTENT-CONFIG", use_instead="CONFIG-1") == "config-1" # neither key nor use_instead exist, so use the default assert configs("NON-EXISTENT-CONFIG", use_instead="NON-EXISTENT-CONFIG-2", default="abc") == "abc" # if we don't have a default value; and key and use_instead doesn't exist; # we get a KeyError about the use_instead key not found. with pytest.raises(KeyError, match=r".*'NON-EXISTENT-CONFIG-2' not set.*"): assert configs("NON-EXISTENT-CONFIG", use_instead="NON-EXISTENT-CONFIG-2")
def test_iterator(): configs = GConfigs(backend=DummyBackend) # iterate with forloop for config in configs: # Make sure the object is a namedtuple assert ( issubclass(config.__class__, tuple) and config._fields ), "Looks like the iterator is not returning a namedtuple anymore." assert config assert config.key # guarantee the namedtuple is being properly created assert ( configs(config.key) == config.value ), "Looks like the namedtuple is not being properly created." # after an iterate in forloops it should have nothing left for next() with pytest.raises(StopIteration): next(configs) # but it's possible to iterator as many as you can with `self.iterator()` iter_configs = configs.iterator() for config in iter_configs: assert config
def test_backend_with_load_file_method(): """ Testing backend with ``load_file(filepath: str)`` method I just need a backend with the ``load_file(filepath: str)`` and test if ```load_file(filepath: str)`` will also be available in a instance of ``GConfigs()``. The actual test of how ``load_file`` works it's """ class DummyBackendLoadFile(DummyBackend): def load_file(self, filepath): pass configs = GConfigs(backend=DummyBackendLoadFile) assert configs.load_file configs.load_file("foo") # Instances of ``Gconfigs``, using backends with # no ``load_file(filepath: str)`` should not have a ``load_file`` itself. with pytest.raises( AttributeError, match=r".*'GConfigs' object has no attribute 'load_file'.*" ): GConfigs(backend=DummyBackend).load_file
def test_get_typed_configs(): """Check if gConfigs deal with typed configs Most backends will probably return strings as value of a config, but if someone cast the value it's nice to know if gConfigs is ok with this. """ configs = GConfigs(backend=DummyBackend) assert configs("CONFIG-1") == "config-1" assert configs("CONFIG-NONE") is None assert configs("CONFIG-TRUE") is True assert configs("CONFIG-FALSE") is False assert configs("CONFIG-INT") == 1 assert configs("CONFIG-FLOAT") == 1.1 assert configs("CONFIG-LIST") == [1, 1.1, "a"] assert configs("CONFIG-TUPLE") == (1, 1.1, "a") assert configs("CONFIG-DICT") == {"a": 1, "b": "b"}
def test_get_configs_info(): configs = GConfigs(backend=DummyBackend) # if given key is in configs (backend.keys()) assert "CONFIG-1" in configs assert "NON-EXISTENT-CONFIG" not in configs assert len(configs) == len(configs._backend.data) assert configs("CONFIG-1") == "config-1" # Non existent config with pytest.raises(KeyError): configs("NON-EXISTENT-CONFIG") # Non existent config - return default instead assert configs("NON-EXISTENT-CONFIG", default="default") == "default" # default argument can be anything # achieved by using the `gconfigs.gconfigs.NOTSET` trick assert configs("NON-EXISTENT-CONFIG", default=None) is None assert configs("NON-EXISTENT-CONFIG", default=True) is True assert configs("NON-EXISTENT-CONFIG", default=False) is False
def test_get_and_cast_value(): configs = GConfigs(backend=DummyBackend) # BOOLEAN assert configs.as_bool("CONFIG-TRUE") # when backend return a bool already assert configs.as_bool("CONFIG-TRUE-STRING") assert isinstance(configs.as_bool("CONFIG-TRUE-STRING"), bool) assert not configs.as_bool("CONFIG-FALSE-STRING") assert isinstance(configs.as_bool("CONFIG-FALSE-STRING"), bool) assert configs.as_bool("NON-EXISTENT-CONFIG", default=True) assert isinstance(configs.as_bool("NON-EXISTENT-CONFIG", default=True), bool) with pytest.raises(ValueError, match=r".*Could not cast the value.*"): configs.as_bool("CONFIG-NONE") # LIST assert configs.as_list("CONFIG-LIST") == [1, 1.1, "a"] assert configs.as_list("CONFIG-TUPLE") == [1, 1.1, "a"] assert configs.as_list("CONFIG-LIST-STRING-JSON-STYLE") == [1, 1.1, "a"] with pytest.raises(ValueError, match=r".*Could not cast the value.*"): configs.as_list("CONFIG-NONE") # DICT assert configs.as_dict("CONFIG-DICT") == {"a": 1, "b": "b"} assert configs.as_dict("CONFIG-DICT-JSON-STYLE") == {"a": 1, "b": "b"} with pytest.raises(ValueError, match=r".*Could not cast the value.*"): configs.as_dict("CONFIG-NONE") # trigger exception on GConfigs._cast() with pytest.raises(ValueError, match=r".*must be a valid json value.*"): configs.as_list("CONFIG-LIST-STRING-JSON-STYLE-BROKEN")