def test_GIVEN_valid_data_WHEN_create_new_THEN_new_set_created(self):

        self.login(access_level=constants.USER_ACCESS_LEVEL_ADMIN)

        valid_params = self.create_valid_post_values()

        response = self.app.post(
            url=url(controller='driving_data', action='edit'),
            params=valid_params,
            expect_errors=True
        )

        assert_that(response.status_code, is_(302), "no redirect after successful post got %s" % response.normal_body)

        with session_scope() as session:
            driving_dataset_id = session\
                .query(DrivingDataset)\
                .filter(DrivingDataset.name == self.new_driving_dataset.name)\
                .one().id
            driving_dataset = DatasetService().get_driving_dataset_by_id(driving_dataset_id)

        assert_that(driving_dataset.name, is_(self.new_driving_dataset.name), "name")
        assert_that(driving_dataset.description, is_(self.new_driving_dataset.description), "description")
        assert_that(driving_dataset.geographic_region, is_(self.new_driving_dataset.geographic_region), "geographic_region")
        assert_that(driving_dataset.spatial_resolution, is_(self.new_driving_dataset.spatial_resolution), "spatial_resolution")
        assert_that(driving_dataset.temporal_resolution, is_(self.new_driving_dataset.temporal_resolution), "temporal_resolution")
        assert_that(driving_dataset.boundary_lat_north, is_(self.new_driving_dataset.boundary_lat_north), "boundary_lat_north")
        assert_that(driving_dataset.boundary_lat_south, is_(self.new_driving_dataset.boundary_lat_south), "boundary_lat_south")
        assert_that(driving_dataset.boundary_lon_east, is_(self.new_driving_dataset.boundary_lon_east), "boundary_lon_east")
        assert_that(driving_dataset.boundary_lon_west, is_(self.new_driving_dataset.boundary_lon_west), "boundary_lon_west")
        assert_that(driving_dataset.view_order_index, is_(self.new_driving_dataset.view_order_index), "view_order_index")
        assert_that(driving_dataset.usage_order_index, is_(self.new_driving_dataset.usage_order_index), "usage_order_index")
        assert_that(driving_dataset.time_start, is_(self.new_driving_dataset.time_start), "start time")
        assert_that(driving_dataset.time_end, is_(self.new_driving_dataset.time_end), "end time")

        assert_that(driving_dataset.get_python_parameter_value(constants.JULES_PARAM_DRIVE_DATA_START),
                    is_(self.new_driving_dataset.time_start), "start time")
        assert_that(driving_dataset.get_python_parameter_value(constants.JULES_PARAM_DRIVE_DATA_END),
                    is_(self.new_driving_dataset.time_end), "end time")
        assert_that(driving_dataset.get_python_parameter_value(constants.JULES_PARAM_INPUT_GRID_NX),
                    is_(valid_params["drive_nx"]), "nx")
        assert_that(driving_dataset.get_python_parameter_value(constants.JULES_PARAM_DRIVE_NVARS),
                    is_(valid_params["drive_nvars"]), "drive_nvars")
        assert_that(driving_dataset.get_python_parameter_value(constants.JULES_PARAM_DRIVE_VAR),
                    is_(self.drive_var), "vars")
        assert_that(len(driving_dataset.locations), is_(2), "number of locations")
    def test_GIVEN_valid_data_with_extra_parameters_WHEN_update_THEN_parameters_are_updated(self):

        with session_scope(Session) as session:
            original_count = session\
                .query(DrivingDataset).count()

            parameter_value = DrivingDatasetParameterValue(ModelRunService(), self.driving_dataset, 23, "old value")
            param_id_to_delete = 1
            parameter_value = DrivingDatasetParameterValue(ModelRunService(), self.driving_dataset, param_id_to_delete,
                                                           "to be deleted")

        self.login(access_level=constants.USER_ACCESS_LEVEL_ADMIN)

        valid_params = self.create_valid_post_values()
        valid_params["params_count"] = 1
        parameter_id = 23
        valid_params["param-0.id"] = str(parameter_id)
        valid_params["param-0.value"] = "expected extra parameter value"

        valid_params["mask_count"] = 1
        valid_params["region-0.name"] = "a value"
        valid_params["region-0.category"] = "a value"
        valid_params["region-0.path"] = "a value"
        valid_params["region-0.id"] = ""

        expected_nvars = len(self.drive_var) + 1
        last_index = len(self.drive_var) + 4
        valid_params["drive_nvars"] = last_index + 1
        valid_params["drive_var_-{}.vars".format(last_index)] = 'blah'
        valid_params["drive_var_-{}.names".format(last_index)] = 'blah'
        valid_params["drive_var_-{}.templates".format(last_index)] = 'blah'
        valid_params["drive_var_-{}.interps".format(last_index)] = 'blah'

        response = self.app.post(
            url=url(controller='driving_data', action='edit', id=str(self.driving_dataset.id)),
            params=valid_params,
            expect_errors=True
        )

        assert_that(response.status_code, is_(302), "status code for page")

        with session_scope(Session) as session:
            final_count = session\
                .query(DrivingDataset).count()

        assert_that(final_count, is_(original_count), "number of driving datasets (before and after update)")

        with session_scope(Session) as session:
            driving_dataset = DatasetService().get_driving_dataset_by_id(self.driving_dataset.id)
        regions = LandCoverService().get_land_cover_regions(self.driving_dataset.id)

        assert_that(driving_dataset.name, is_(self.new_driving_dataset.name), "name has changed")
        value = [parameter_value for parameter_value in driving_dataset.parameter_values if parameter_value.parameter_id == parameter_id]
        assert_that(len(value), is_(1), "number of parameter values")
        assert_that(value[0].value, is_(valid_params["param-0.value"]), "parameter value")


        assert_that(driving_dataset.get_python_parameter_value(constants.JULES_PARAM_DRIVE_NVARS), is_(expected_nvars), "nvars")

        for parameter_value in driving_dataset.parameter_values:
            if parameter_value.parameter_id == param_id_to_delete:
                self.fail("Parameter should have been deleted but wasn't")


        assert_that(len(regions), is_(1), "number of regions")
        assert_that(regions[0].name, is_(valid_params["region-0.name"]), "name of region")
        assert_that(regions[0].category.name, is_(valid_params["region-0.category"]), "category of region")
        assert_that(regions[0].mask_file, is_(valid_params["region-0.path"]), "path of region")

        assert_that(len(driving_dataset.locations), is_(expected_nvars), 'driving dataset locations')