123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- # Copyright 2021-2024 Avaiga Private Limited
- #
- # Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- # the License. You may obtain a copy of the License at
- #
- # http://www.apache.org/licenses/LICENSE-2.0
- #
- # Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- # specific language governing permissions and limitations under the License.
- import json
- import os
- import pathlib
- import shutil
- import pytest
- from taipy.core.exceptions.exceptions import ModelNotFound
- from .mocks import MockConverter, MockFSRepository, MockModel, MockObj
- class TestRepositoriesStorage:
- def test_load_from_non_existent_file_on_fs_repo(self):
- r = MockFSRepository(model_type=MockModel, dir_name="mock_model", converter=MockConverter)
- # The file does not exist should raise ModelNotFound exception
- with pytest.raises(ModelNotFound):
- r._load("non_existent_file")
- # The file exists but is empty should also raise ModelNotFound exception
- os.makedirs(r.dir_path)
- with open(r.dir_path / "empty_file.json", "w") as f:
- f.write("")
- assert r._exists("empty_file")
- with pytest.raises(ModelNotFound):
- r._load("empty_file")
- @pytest.mark.parametrize(
- "mock_repo,params",
- [
- (MockFSRepository, {"model_type": MockModel, "dir_name": "mock_model", "converter": MockConverter}),
- ],
- )
- def test_save_and_fetch_model(self, mock_repo, params):
- r = mock_repo(**params)
- m = MockObj("uuid", "foo")
- r._save(m)
- fetched_model = r._load(m.id)
- assert m == fetched_model
- @pytest.mark.parametrize(
- "mock_repo,params",
- [
- (MockFSRepository, {"model_type": MockModel, "dir_name": "mock_model", "converter": MockConverter}),
- ],
- )
- def test_exists(self, mock_repo, params):
- r = mock_repo(**params)
- m = MockObj("uuid", "foo")
- r._save(m)
- assert r._exists(m.id)
- assert not r._exists("not-existed-model")
- @pytest.mark.parametrize(
- "mock_repo,params",
- [
- (MockFSRepository, {"model_type": MockModel, "dir_name": "mock_model", "converter": MockConverter}),
- ],
- )
- def test_get_all(self, mock_repo, params):
- objs = []
- r = mock_repo(**params)
- r._delete_all()
- for i in range(5):
- m = MockObj(f"uuid-{i}", f"Foo{i}")
- objs.append(m)
- r._save(m)
- _objs = r._load_all()
- assert len(_objs) == 5
- for obj in _objs:
- assert isinstance(obj, MockObj)
- assert sorted(objs, key=lambda o: o.id) == sorted(_objs, key=lambda o: o.id)
- @pytest.mark.parametrize(
- "mock_repo,params",
- [
- (MockFSRepository, {"model_type": MockModel, "dir_name": "mock_model", "converter": MockConverter}),
- ],
- )
- def test_delete_all(self, mock_repo, params):
- r = mock_repo(**params)
- r._delete_all()
- for i in range(5):
- m = MockObj(f"uuid-{i}", f"Foo{i}")
- r._save(m)
- _models = r._load_all()
- assert len(_models) == 5
- r._delete_all()
- _models = r._load_all()
- assert len(_models) == 0
- @pytest.mark.parametrize(
- "mock_repo,params",
- [
- (MockFSRepository, {"model_type": MockModel, "dir_name": "mock_model", "converter": MockConverter}),
- ],
- )
- def test_delete_many(self, mock_repo, params):
- r = mock_repo(**params)
- r._delete_all()
- for i in range(5):
- m = MockObj(f"uuid-{i}", f"Foo{i}")
- r._save(m)
- _models = r._load_all()
- assert len(_models) == 5
- r._delete_many(["uuid-0", "uuid-1"])
- _models = r._load_all()
- assert len(_models) == 3
- @pytest.mark.parametrize(
- "mock_repo,params",
- [
- (MockFSRepository, {"model_type": MockModel, "dir_name": "mock_model", "converter": MockConverter}),
- ],
- )
- def test_search(self, mock_repo, params):
- r = mock_repo(**params)
- r._delete_all()
- m = MockObj("uuid", "foo")
- r._save(m)
- m1 = r._search("name", "bar")
- m2 = r._search("name", "foo")
- assert m1 == []
- assert m2 == [m]
- @pytest.mark.parametrize(
- "mock_repo,params",
- [
- (MockFSRepository, {"model_type": MockModel, "dir_name": "mock_model", "converter": MockConverter}),
- ],
- )
- @pytest.mark.parametrize("export_path", ["tmp"])
- def test_export(self, mock_repo, params, export_path):
- r = mock_repo(**params)
- m = MockObj("uuid", "foo")
- r._save(m)
- r._export("uuid", export_path)
- assert pathlib.Path(os.path.join(export_path, "mock_model/uuid.json")).exists()
- with open(os.path.join(export_path, "mock_model/uuid.json"), "r") as exported_file:
- exported_data = json.load(exported_file)
- assert exported_data["id"] == "uuid"
- assert exported_data["name"] == "foo"
- # Export to same location again should work
- r._export("uuid", export_path)
- assert pathlib.Path(os.path.join(export_path, "mock_model/uuid.json")).exists()
- shutil.rmtree(export_path, ignore_errors=True)
|