Source code for ase2sprkkr.asr.test.test_database_fromtree

"""Tests of asr.database.from_tree."""

from asr.core import chdir
from ase.io import read
import pytest
import os
from pathlib import Path
from .materials import Si, Fe


[docs] @pytest.fixture def folder_tree(): """Set up a tree like folder structure.""" from asr.setup.displacements import main as displacements folders = [('materials/Si2', Si), ('materials/Si2/repeated', Si.repeat((2, 1, 1))), ('materials/Fe', Fe)] for folder, atoms in folders: os.makedirs(folder) atoms.write(Path(folder) / 'structure.json') with chdir('materials/Si2/'): displacement_results = displacements() displacement_folders = [ ('materials/Si2/' + folder, read(Path(folder) / 'structure.json')) for folder in displacement_results['folders'] ] folders.extend(displacement_folders) return folders
[docs] def make_tree(folder: str): tree = set() for root, dirs, files in os.walk(folder, topdown=True, followlinks=False): for filename in [''] + files: name = Path(root) / filename rel_path = str(name.relative_to(folder)) tree.add(rel_path) return tree
[docs] @pytest.mark.ci @pytest.mark.parametrize('njobs', [1, 2, 8]) def test_database_fromtree_totree(asr_tmpdir, folder_tree, njobs): """Make sure a database can be packed and unpacked faithfully.""" from asr.database.fromtree import main as fromtree from asr.database.totree import main as totree from ase.db import connect folders = [folder[0] for folder in folder_tree] fromtree(folders=['materials'], recursive=True, njobs=njobs) db = connect('database.db') assert len(db) == len(folders) row = db.get(folder=folder_tree[0][0]) childfolders = [] for folder in folder_tree[1:]: try: child = str(Path(folder[0]).relative_to('materials/Si2')) childfolders.append(child) except ValueError: pass children = row.data['__children__'] assert set(childfolders) == set(children) totree('database.db', tree_structure='tree/{row.formula}', run=True) tree1 = make_tree('materials') tree2 = make_tree('tree') assert {'.', 'Si2'}.issubset(tree1) assert tree1 == tree2
[docs] @pytest.mark.ci def test_database_fromtree_raises_when_missing_uids(asr_tmpdir, folder_tree): """Make sure a database can be packed and unpacked faithfully.""" from asr.database.fromtree import main as fromtree from asr.database.fromtree import MissingUIDS with pytest.raises(MissingUIDS): fromtree(folders=['materials/Si2'])
[docs] @pytest.mark.ci def test_database_fromtree_works_without_write_permission( asr_tmpdir, folder_tree): from asr.database.fromtree import main as fromtree import stat os.chmod(folder_tree[0][0], stat.S_IRUSR | stat.S_IXUSR) try: fromtree(folders=['materials/Si2'], recursive=True) finally: os.chmod(folder_tree[0][0], stat.S_IRUSR | stat.S_IXUSR | stat.S_IWUSR)