Пример #1
0
class TestPortal(TestCase):
    portal = qiita_config.portal

    def setUp(self):
        self.study = Study(1)
        self.analysis = Analysis(1)
        self.qiita_portal = Portal('QIITA')
        self.emp_portal = Portal('EMP')

    def tearDown(self):
        qiita_config.portal = self.portal

    def test_list_portals(self):
        obs = Portal.list_portals()
        exp = ['EMP']
        self.assertEqual(obs, exp)

    def test_add_portal(self):
        Portal.create("NEWPORTAL", "SOMEDESC")
        obs = self.conn_handler.execute_fetchall(
            "SELECT * FROM qiita.portal_type")
        exp = [[1, 'QIITA', 'QIITA portal. Access to all data stored '
                'in database.'],
               [2, 'EMP', 'EMP portal'],
               [4, 'NEWPORTAL', 'SOMEDESC']]
        self.assertItemsEqual(obs, exp)

        obs = self.conn_handler.execute_fetchall(
            "SELECT * FROM qiita.analysis_portal")
        exp = [[1, 1], [2, 1], [3, 1], [4, 1], [5, 1], [6, 1], [7, 2], [8, 2],
               [9, 2], [10, 2], [11, 4], [12, 4], [13, 4], [14, 4]]
        self.assertItemsEqual(obs, exp)

        with self.assertRaises(QiitaDBDuplicateError):
            Portal.create("EMP", "DOESNTMATTERFORDESC")

    def test_remove_portal(self):
        Portal.create("NEWPORTAL", "SOMEDESC")
        # Select some samples on a default analysis
        qiita_config.portal = "NEWPORTAL"
        a = Analysis(User("*****@*****.**").default_analysis)
        a.add_samples({1: ['1.SKB8.640193', '1.SKD5.640186']})

        Portal.delete("NEWPORTAL")
        obs = self.conn_handler.execute_fetchall(
            "SELECT * FROM qiita.portal_type")
        exp = [[1, 'QIITA', 'QIITA portal. Access to all data stored '
                'in database.'],
               [2, 'EMP', 'EMP portal']]
        self.assertItemsEqual(obs, exp)

        obs = self.conn_handler.execute_fetchall(
            "SELECT * FROM qiita.analysis_portal")
        exp = [[1, 1], [2, 1], [3, 1], [4, 1], [5, 1], [6, 1], [7, 2], [8, 2],
               [9, 2], [10, 2]]
        self.assertItemsEqual(obs, exp)

        with self.assertRaises(QiitaDBLookupError):
            Portal.delete("NOEXISTPORTAL")
        with self.assertRaises(QiitaDBError):
            Portal.delete("QIITA")

        Portal.create("NEWPORTAL2", "SOMEDESC")
        # Add analysis to this new portal and make sure error raised
        qiita_config.portal = "NEWPORTAL2"
        Analysis.create(User("*****@*****.**"), "newportal analysis", "desc")
        qiita_config.portal = "QIITA"
        with self.assertRaises(QiitaDBError):
            Portal.delete("NEWPORTAL2")

        # Add study to this new portal and make sure error raised
        info = {
            "timeseries_type_id": 1,
            "metadata_complete": True,
            "mixs_compliant": True,
            "number_samples_collected": 25,
            "number_samples_promised": 28,
            "study_alias": "FCM",
            "study_description": "Microbiome of people who eat nothing but "
                                 "fried chicken",
            "study_abstract": "Exploring how a high fat diet changes the "
                              "gut microbiome",
            "emp_person_id": StudyPerson(2),
            "principal_investigator_id": StudyPerson(3),
            "lab_person_id": StudyPerson(1)
        }
        Portal.create("NEWPORTAL3", "SOMEDESC")
        qiita_config.portal = "NEWPORTAL3"
        Study.create(User('*****@*****.**'), "Fried chicken microbiome",
                     [1], info)
        qiita_config.portal = "QIITA"
        with self.assertRaises(QiitaDBError):
            Portal.delete("NEWPORTAL3")

    def test_check_studies(self):
        with self.assertRaises(QiitaDBError):
            self.qiita_portal._check_studies([2000000000000, 122222222222222])

    def test_check_analyses(self):
        with self.assertRaises(QiitaDBError):
            self.qiita_portal._check_analyses([2000000000000, 122222222222222])

        with self.assertRaises(QiitaDBError):
            self.qiita_portal._check_analyses([8, 9])

    def test_get_studies_by_portal(self):
        obs = self.emp_portal.get_studies()
        self.assertEqual(obs, set())

        obs = self.qiita_portal.get_studies()
        self.assertEqual(obs, {1})

    def test_add_study_portals(self):
        self.emp_portal.add_studies([self.study.id])
        obs = self.study._portals
        self.assertEqual(obs, ['EMP', 'QIITA'])

        obs = npt.assert_warns(
            QiitaDBWarning, self.emp_portal.add_studies, [self.study.id])

    def test_remove_study_portals(self):
        with self.assertRaises(ValueError):
            self.qiita_portal.remove_studies([self.study.id])

        self.emp_portal.add_studies([1])
        # Set up the analysis in EMP portal
        self.emp_portal.add_analyses([self.analysis.id])
        obs = self.analysis._portals
        self.assertItemsEqual(obs, ['QIITA', 'EMP'])

        # Test study removal failure
        with self.assertRaises(QiitaDBError):
            self.emp_portal.remove_studies([self.study.id])
        obs = self.study._portals
        self.assertItemsEqual(obs, ['QIITA', 'EMP'])

        # Test study removal
        self.emp_portal.remove_analyses([self.analysis.id])
        self.emp_portal.remove_studies([self.study.id])
        obs = self.study._portals
        self.assertEqual(obs, ['QIITA'])

        obs = npt.assert_warns(
            QiitaDBWarning, self.emp_portal.remove_studies, [self.study.id])

    def test_get_analyses_by_portal(self):
        obs = self.emp_portal.get_analyses()
        self.assertEqual(obs, {7, 8, 9, 10})

        obs = self.qiita_portal.get_analyses()
        self.assertEqual(obs, {1, 2, 3, 4, 5, 6})

    def test_add_analysis_portals(self):
        obs = self.analysis._portals
        self.assertEqual(obs, ['QIITA'])
        with self.assertRaises(QiitaDBError):
            self.emp_portal.add_analyses([self.analysis.id])
        obs = self.analysis._portals
        self.assertEqual(obs, ['QIITA'])

        self.emp_portal.add_studies([1])
        self.emp_portal.add_analyses([self.analysis.id])
        obs = self.analysis._portals
        self.assertEqual(obs, ['EMP', 'QIITA'])

        obs = npt.assert_warns(
            QiitaDBWarning, self.emp_portal.add_analyses, [self.analysis.id])

    def test_remove_analysis_portals(self):
        with self.assertRaises(ValueError):
            self.qiita_portal.remove_analyses([self.analysis.id])

        # set up the analysis in EMP portal
        self.emp_portal.add_studies([1])
        self.emp_portal.add_analyses([self.analysis.id])
        obs = self.analysis._portals
        self.assertItemsEqual(obs, ['QIITA', 'EMP'])
        # Test removal
        self.emp_portal.remove_analyses([self.analysis.id])
        obs = self.analysis._portals
        self.assertEqual(obs, ['QIITA'])

        obs = npt.assert_warns(
            QiitaDBWarning, self.emp_portal.remove_analyses,
            [self.analysis.id])