class TestWriteCache: @pytest.mark.parametrize( "key,content", (("unknownkey", "content1"), ("another-one", "content2")), ) def test_write_cache_write_key_name_in_data_dir_when_data_path_absent( self, tmpdir, key, content): """When key is not in data_paths, write content to data_dir/key.""" cfg = UAConfig({"data_dir": tmpdir.strpath}) expected_path = tmpdir.join(PRIVATE_SUBDIR, key) assert not expected_path.check(), "Found unexpected file {}".format( expected_path) assert None is cfg.write_cache(key, content) assert expected_path.check(), "Missing expected file {}".format( expected_path) assert content == cfg.read_cache(key) def test_write_cache_creates_secure_private_dir(self, tmpdir): """private_dir is created with permission 0o700.""" cfg = UAConfig({"data_dir": tmpdir.strpath}) # unknown keys are written to the private dir expected_dir = tmpdir.join(PRIVATE_SUBDIR) assert None is cfg.write_cache("somekey", "somevalue") assert True is os.path.isdir( expected_dir.strpath), "Missing expected directory {}".format( expected_dir) assert 0o700 == stat.S_IMODE(os.lstat(expected_dir.strpath).st_mode) def test_write_cache_creates_dir_when_data_dir_does_not_exist( self, tmpdir): """When data_dir doesn't exist, create it.""" tmp_subdir = tmpdir.join("does/not/exist") cfg = UAConfig({"data_dir": tmp_subdir.strpath}) assert False is os.path.isdir( tmp_subdir.strpath), "Found unexpected directory {}".format( tmp_subdir) assert None is cfg.write_cache("somekey", "someval") assert True is os.path.isdir( tmp_subdir.strpath), "Missing expected directory {}".format( tmp_subdir) assert "someval" == cfg.read_cache("somekey") @pytest.mark.parametrize("key,value", (("dictkey", { "1": "v1" }), ("listkey", [1, 2, 3]))) def test_write_cache_writes_json_string_when_content_not_a_string( self, tmpdir, key, value): """When content is not a string, write a json string.""" cfg = UAConfig({"data_dir": tmpdir.strpath}) expected_json_content = json.dumps(value) assert None is cfg.write_cache(key, value) with open(tmpdir.join(PRIVATE_SUBDIR, key).strpath, "r") as stream: assert expected_json_content == stream.read() assert value == cfg.read_cache(key) @pytest.mark.parametrize( "datapath,mode", ((DataPath("path", False), 0o644), (DataPath("path", True), 0o600)), ) def test_permissions(self, tmpdir, datapath, mode): cfg = UAConfig({"data_dir": tmpdir.strpath}) cfg.data_paths = {"path": datapath} cfg.write_cache("path", "") assert mode == stat.S_IMODE(os.lstat(cfg.data_path("path")).st_mode) def test_write_datetime(self, tmpdir): cfg = UAConfig({"data_dir": tmpdir.strpath}) key = "test_key" dt = datetime.datetime.now() cfg.write_cache(key, dt) with open(cfg.data_path(key)) as f: assert dt.isoformat() == f.read().strip('"')
def test_data_path_returns_public_path_for_public_datapath(self): cfg = UAConfig({"data_dir": "/my/d"}) cfg.data_paths["test_path"] = DataPath("test_path", False) assert "/my/d/test_path" == cfg.data_path("test_path")