Beispiel #1
0
 def setUp(self):
     self.portal = self.layer['portal']
     self.experiments = self.portal[defaults.EXPERIMENTS_FOLDER_ID]
     self.datasets = self.portal[defaults.DATASETS_FOLDER_ID]
     # create and run sdm experiment
     sdmform = SDMExperimentHelper(self.portal).get_form()
     sdmform.request.form.update({
         'form.buttons.save': 'Create and start',
     })
     # update form with updated request
     sdmform.update()
     transaction.commit()
     # We should have only one SDM
     sdmexp = self.experiments.values()[0]
     self.form = ProjectionExperimentHelper(self.portal, sdmexp)
 def setUp(self, mock_run_script):
     self.portal = self.layer['portal']
     self.experiments = self.portal[defaults.EXPERIMENTS_FOLDER_ID]
     self.datasets = self.portal[defaults.DATASETS_FOLDER_ID]
     # create and run sdm experiment
     formhelper = SDMExperimentHelper(self.portal)
     sdmform = formhelper.get_form()
     sdmform.request.form.update({
         'form.buttons.save': 'Create and start',
     })
     # update form with updated request
     sdmform.update()
     # setup mock_run_script
     mock_run_script.side_effect = formhelper.mock_run_script
     transaction.commit()
     # We should have only one SDM
     sdmexp = self.experiments.values()[0]
     self.form = ProjectionExperimentHelper(self.portal, sdmexp)
class ExperimentProjectionAddTest(unittest.TestCase):

    # Use functional layer for now to get a new demostorage layer for each test
    layer = BCCVL_FUNCTIONAL_TESTING
    # integration testing gives only a new transaction for each test
    # (rolled back at end)
    # layer = BCCVL_INTEGRATION_TESTING

    @mock.patch('pwd.getpwuid',
                mock.MagicMock(return_value=mock.MagicMock(pw_name='bccvl')))
    @mock.patch('org.bccvl.tasks.compute.run_script')
    def setUp(self, mock_run_script):
        self.portal = self.layer['portal']
        self.experiments = self.portal[defaults.EXPERIMENTS_FOLDER_ID]
        self.datasets = self.portal[defaults.DATASETS_FOLDER_ID]
        # create and run sdm experiment
        formhelper = SDMExperimentHelper(self.portal)
        sdmform = formhelper.get_form()
        sdmform.request.form.update({
            'form.buttons.save': 'Create and start',
        })
        # update form with updated request
        sdmform.update()
        # setup mock_run_script
        mock_run_script.side_effect = formhelper.mock_run_script
        transaction.commit()
        # We should have only one SDM
        sdmexp = self.experiments.values()[0]
        self.form = ProjectionExperimentHelper(self.portal, sdmexp)
        # TODO: setup shortcuts suitable for CC
        #   need 2 future datasets with different resolutions
        # need 2 raster datasets for input, to check fallback of non-future
        # layer

    def test_add_experiment_missing_input(self):
        form = self.form.get_form()
        # remove required field
        del form.request.form['form.widgets.IDublinCore.title']
        form.request.form.update({
            'form.buttons.create': 'Create',
        })
        # submit form
        form.update()
        errors = [e for e in form.widgets.errors]
        self.assertEqual(len(errors), 1)
        # check self.experiments still empty
        # IStatusMessage

    @mock.patch('org.bccvl.tasks.compute.run_script')
    def test_add_experiment(self, mock_run_script):
        form = self.form.get_form()
        form.request.form.update({
            'form.buttons.save': 'Create and start',
        })
        # update form with updated request
        form.update()
        self.assertEqual(form.status, u'')
        self.assertEqual(len(form.widgets.errors), 0)
        self.assertIn('my-cc-experiment', self.experiments)
        exp = self.experiments['my-cc-experiment']
        # TODO: update asserts
        self.assertEqual(exp.future_climate_datasets, [
                         unicode(self.form.future.UID())])
        # FIXME: submitting with an empty model list doesn't cause form to fail
        self.assertEqual(exp.species_distribution_models,
                         {self.form.sdmexp.UID(): {self.form.sdmmodel.UID(): {'label': u'0.5', 'value': Decimal('0.5')}}})

        # get result container: (there is only one)
        self.assertEqual(len(exp.objectIds()), 1)
        result = exp.objectValues()[0]
        # FIXME: test result.job_params
        self.assertEqual(result.job_params['future_climate_datasets'],
                         {exp.future_climate_datasets[0]: set([u'B01',
                                                               u'B02'])})
        # only one experiment so we only need to check first model
        self.assertEqual(result.job_params['species_distribution_models'],
                         exp.species_distribution_models.values()[0].keys()[0])
        self.assertEqual(result.job_params['resolution'], u'Resolution30m')
        self.assertEqual(result.job_params['emsc'], u'RCP3PD')
        self.assertEqual(result.job_params['gcm'], u'cccma-cgcm31')
        self.assertEqual(result.job_params['year'], 2015)
        # no result files yet
        self.assertEqual(len(result.keys()), 0)
        # test job state
        jt = IExperimentJobTracker(exp)
        self.assertEqual(jt.state, u'QUEUED')
        # setup mock_run_script
        mock_run_script.side_effect = self.form.mock_run_script
        # after transaction commit the job should finish
        transaction.commit()
        self.assertEqual(jt.state, u'COMPLETED')
        # and we should have a result as well
        self.assertGreaterEqual(len(result.keys()), 1)
        # TODO: check result metadata

    @mock.patch('org.bccvl.tasks.compute.run_script')
    def test_mixed_resolution(self, mock_run_script):
        future_1k_uuid = unicode(
            self.datasets[defaults.DATASETS_CLIMATE_FOLDER_ID]['future_1k'].UID())
        form = self.form.get_form()
        form.request.form.update({
            'form.buttons.save': 'Create and start',
            # select 1k dataset as well
            'form.widgets.future_climate_datasets': [future_1k_uuid],
        })
        form.update()
        # setup mock_run_script
        mock_run_script.side_effect = self.form.mock_run_script
        # run experiment
        transaction.commit()
        exp = self.experiments['my-cc-experiment']
        result = exp.values()[0]
        expmd = IBCCVLMetadata(exp)
        # We should have the missing layers filled by sdm env layer datasets
        self.assertEqual(
            result.job_params['future_climate_datasets'],
            {
                future_1k_uuid: set([u'B01']),
                self.form.sdmexp.environmental_datasets.keys()[0]: set([u'B02'])
            }
        )
        # resolution should be set to the lowest of selected datasets
        self.assertEqual(expmd['resolution'], 'Resolution2_5m')
class ExperimentProjectionAddTest(unittest.TestCase):

    # Use functional layer for now to get a new demostorage layer for each test
    layer = BCCVL_FUNCTIONAL_TESTING
    # integration testing gives only a new transaction for each test
    # (rolled back at end)
    # layer = BCCVL_INTEGRATION_TESTING

    @mock.patch('pwd.getpwuid',
                mock.MagicMock(return_value=mock.MagicMock(pw_name='bccvl')))
    @mock.patch('org.bccvl.tasks.compute.run_script')
    def setUp(self, mock_run_script):
        self.portal = self.layer['portal']
        self.experiments = self.portal[defaults.EXPERIMENTS_FOLDER_ID]
        self.datasets = self.portal[defaults.DATASETS_FOLDER_ID]
        # create and run sdm experiment
        formhelper = SDMExperimentHelper(self.portal)
        sdmform = formhelper.get_form()
        sdmform.request.form.update({
            'form.buttons.save': 'Create and start',
        })
        # update form with updated request
        sdmform.update()
        # setup mock_run_script
        mock_run_script.side_effect = formhelper.mock_run_script
        transaction.commit()
        # We should have only one SDM
        sdmexp = self.experiments.values()[0]
        self.form = ProjectionExperimentHelper(self.portal, sdmexp)
        # TODO: setup shortcuts suitable for CC
        #   need 2 future datasets with different resolutions
        # need 2 raster datasets for input, to check fallback of non-future
        # layer

    def test_add_experiment_missing_input(self):
        form = self.form.get_form()
        # remove required field
        del form.request.form['form.widgets.IDublinCore.title']
        form.request.form.update({
            'form.buttons.create': 'Create',
        })
        # submit form
        form.update()
        errors = [e for e in form.widgets.errors]
        self.assertEqual(len(errors), 1)
        # check self.experiments still empty
        # IStatusMessage

    @mock.patch('org.bccvl.tasks.compute.run_script')
    def test_add_experiment(self, mock_run_script):
        form = self.form.get_form()
        form.request.form.update({
            'form.buttons.save': 'Create and start',
        })
        # update form with updated request
        form.update()
        self.assertEqual(form.status, u'')
        self.assertEqual(len(form.widgets.errors), 0)
        self.assertIn('my-cc-experiment', self.experiments)
        exp = self.experiments['my-cc-experiment']
        # TODO: update asserts
        self.assertEqual(exp.future_climate_datasets,
                         [unicode(self.form.future.UID())])
        # FIXME: submitting with an empty model list doesn't cause form to fail
        self.assertEqual(
            exp.species_distribution_models, {
                self.form.sdmexp.UID(): {
                    self.form.sdmmodel.UID(): {
                        'label': u'0.5',
                        'value': Decimal('0.5')
                    }
                }
            })

        # get result container: (there is only one)
        self.assertEqual(len(exp.objectIds()), 1)
        result = exp.objectValues()[0]
        # FIXME: test result.job_params
        self.assertEqual(
            result.job_params['future_climate_datasets'],
            {exp.future_climate_datasets[0]: set([u'B01', u'B02'])})
        # only one experiment so we only need to check first model
        self.assertEqual(result.job_params['species_distribution_models'],
                         exp.species_distribution_models.values()[0].keys()[0])
        self.assertEqual(result.job_params['resolution'], u'Resolution30m')
        self.assertEqual(result.job_params['emsc'], u'RCP3PD')
        self.assertEqual(result.job_params['gcm'], u'cccma-cgcm31')
        self.assertEqual(result.job_params['year'], 2015)
        # no result files yet
        self.assertEqual(len(result.keys()), 0)
        # test job state
        jt = IExperimentJobTracker(exp)
        self.assertEqual(jt.state, u'QUEUED')
        # setup mock_run_script
        mock_run_script.side_effect = self.form.mock_run_script
        # after transaction commit the job should finish
        transaction.commit()
        self.assertEqual(jt.state, u'COMPLETED')
        # and we should have a result as well
        self.assertGreaterEqual(len(result.keys()), 1)
        # TODO: check result metadata

    @mock.patch('org.bccvl.tasks.compute.run_script')
    def test_mixed_resolution(self, mock_run_script):
        future_1k_uuid = unicode(self.datasets[
            defaults.DATASETS_CLIMATE_FOLDER_ID]['future_1k'].UID())
        form = self.form.get_form()
        form.request.form.update({
            'form.buttons.save':
            'Create and start',
            # select 1k dataset as well
            'form.widgets.future_climate_datasets': [future_1k_uuid],
        })
        form.update()
        # setup mock_run_script
        mock_run_script.side_effect = self.form.mock_run_script
        # run experiment
        transaction.commit()
        exp = self.experiments['my-cc-experiment']
        result = exp.values()[0]
        expmd = IBCCVLMetadata(exp)
        # We should have the missing layers filled by sdm env layer datasets
        self.assertEqual(
            result.job_params['future_climate_datasets'], {
                future_1k_uuid: set([u'B01']),
                self.form.sdmexp.environmental_datasets.keys()[0]: set(
                    [u'B02'])
            })
        # resolution should be set to the lowest of selected datasets
        self.assertEqual(expmd['resolution'], 'Resolution2_5m')