class TestDatasetService(TestController):
    """
    Test for the dataset service
    """

    def setUp(self):
        super(TestDatasetService, self).setUp()
        self.dataset_service = DatasetService()
        self.clean_database()

    def test_GIVEN_two_driving_datasets_WHEN_get_driving_datasets_THEN_both_driving_datasets_returned(self):
        user = self.login()
        self.create_two_driving_datasets()
        driving_datasets = self.dataset_service.get_driving_datasets(user)
        assert_that(len(driving_datasets), is_(2 + 1))  # Have to also count the 'user upload driving dataset'
        assert_that(driving_datasets[0].name, is_("driving1"))
        assert_that(driving_datasets[1].description, is_("driving 2 description"))

    def test_GIVEN_two_driving_datasets_WHEN_get_spatial_extent_THEN_correct_spatial_extent_returned(self):
        user = self.login()
        self.create_two_driving_datasets()
        driving_datasets = self.dataset_service.get_driving_datasets(user)
        id = driving_datasets[0].id
        spatial_extent = self.dataset_service.get_spatial_extent(id)
        assert_that(spatial_extent._bound_lat_n, is_(50))
        assert_that(spatial_extent._bound_lat_s, is_(-10))
        assert_that(spatial_extent._bound_lon_w, is_(-15))
        assert_that(spatial_extent._bound_lon_e, is_(30))

    def test_GIVEN_driving_dataset_with_parameter_values_THEN_when_get_driving_dataset_by_id_THEN_namelist_parameters_loaded(self):
        user = self.login()
        self.create_two_driving_datasets()
        driving_datasets = self.dataset_service.get_driving_datasets(user)
        id = driving_datasets[0].id
        dataset = self.dataset_service.get_driving_dataset_by_id(id)
        parameter_values = dataset.parameter_values
        for param_val in parameter_values:
            parameter = param_val.parameter
            namelist = parameter.namelist

    def test_GIVEN_driving_dataset_THEN_when_view_by_non_admin_THEN_not_shown(self):
        user = self.login()
        self.clean_database()
        with session_scope() as session:
            self.create_driving_dataset(session, is_restricted_to_admins=True)

        driving_datasets = self.dataset_service.get_driving_datasets(user)

        assert_that(len(driving_datasets), is_(1), "Driving dataset count (just the single cell one)")

    def test_GIVEN_driving_dataset_THEN_when_view_by_admin_THEN_shown(self):
        user = self.login(access_level=constants.USER_ACCESS_LEVEL_ADMIN)
        self.clean_database()
        n_dd = len(self.dataset_service.get_driving_datasets(user))
        with session_scope() as session:
            self.create_driving_dataset(session, is_restricted_to_admins=True)

        driving_datasets = self.dataset_service.get_driving_datasets(user)

        assert_that(len(driving_datasets), is_(n_dd + 1), "Driving dataset count")

    def test_GIVEN_driving_dataset_with_max_less_than_min_THEN_when_view_THEN_max_is_set_at_twice_min(self):
        # If the range is incorrect then THREDDS refuses to show the data so make sure this never happens
        user = self.login()
        self.clean_database()
        with session_scope() as session:
            dataset_id = self.create_dataset(session, data_range_from=10, data_range_to=5)

        dataset = self.dataset_service.get_dataset_by_id(dataset_id, user.id)

        assert_that(dataset.data_range_from, less_than(dataset.data_range_to), "Driving dataset data ranges must be in correct order")