# -*- coding: utf-8 -*-
###########################################################################
# Copyright (c), The AiiDA team. All rights reserved. #
# This file is part of the AiiDA code. #
# #
# The code is hosted on GitHub at https://github.com/aiidateam/aiida_core #
# For further information on the license, see the LICENSE.txt file #
# For further information please visit http://www.aiida.net #
###########################################################################
from aiida.backends.utils import load_dbenv, is_dbenv_loaded
if not is_dbenv_loaded():
load_dbenv()
import unittest
import tempfile
import os.path
import shutil
from aiida.common.exceptions import NotExistent
[docs]class DbTestCase(unittest.TestCase):
"""
Automatically takes care of the setUpClass and TearDownClass, when needed.
This class can be used by any unit test that requires database interaction.
"""
[docs] @classmethod
def setUpClass(cls):
from aiida.orm.user import User
from aiida.orm.computer import Computer
from aiida.common.utils import get_configured_user_email
# I create the user only once:
# We create the user only once:
# Otherwise, get_automatic_user() will fail when the
# user is recreated because it caches the user!
# In any case, store it in cls.user though
# Other possibility: flush the user cache on delete
users = User.search_for_users(email=get_configured_user_email())
assert(len(users) <= 1)
if users:
cls.user = users[0]
else:
cls.user = User(get_configured_user_email())
cls.user.password = 'fakepwd'
cls.user.save()
try:
cls.computer = Computer.get('test_comp')
except NotExistent:
cls.computer = Computer(name='test_comp',
hostname='localhost',
transport_type='local',
scheduler_type='pbspro',
workdir='/tmp/aiida')
cls.computer.store()
[docs] @classmethod
def tearDownClass(cls):
# from aiida.settings import REPOSITORY_PATH
# from aiida.common.setup import TEMP_TEST_REPO_PREFIX
# from aiida.common.exceptions import InvalidOperation
# if not REPOSITORY_PATH.startswith(
# os.path.join("/", tempfile.gettempprefix(),
# TEMP_TEST_REPO_PREFIX)):
# raise InvalidOperation("Be careful. The repository for the tests "
# "is not a test repository. I will not "
# "empty the database and I will not delete "
# "the repository. Repository path: "
# "{}".format(REPOSITORY_PATH))
# from aiida.backends.djsite.db.models import DbComputer
# I first delete the workflows
# from aiida.backends.djsite.db.models import DbWorkflow
# DbWorkflow.objects.all().delete()
# Delete groups
# from aiida.backends.djsite.db.models import DbGroup
# DbGroup.objects.all().delete()
# I first need to delete the links, because in principle I could
# not delete input nodes, only outputs. For simplicity, since
# I am deleting everything, I delete the links first
# from aiida.backends.djsite.db.models import DbLink
# DbLink.objects.all().delete()
# Then I delete the nodes, otherwise I cannot
# delete computers and users
from aiida.backends.djsite.db.models import DbNode
# DbNode.objects.all().delete()
## I do not delete it, see discussion in setUpClass
# try:
# DbUser.objects.get(email=get_configured_user_email()).delete()
# except ObjectDoesNotExist:
# pass
import aiida.orm.computer as computer
try:
computer.Util.get_default().delete_computer(cls.computer.pk)
except:
pass
# from aiida.backends.djsite.db.models import DbLog
# DbLog.objects.all().delete()
# I clean the test repository
# shutil.rmtree(REPOSITORY_PATH, ignore_errors=True)
# os.makedirs(REPOSITORY_PATH)