def test_parameter_validation(self):

        # calling helper with only one argument
        self.assertDictEqual({},
                             JourneyStoreApi._parameter_validation(helper,
                                                                   a="a"))

        # call with a keyword
        # calling helper with only one argument and keyword
        self.assertDictEqual({},
                             JourneyStoreApi._parameter_validation(
                                 helper, "b", name="mwaside"))

        # calling with all keywords
        self.assertDictEqual({},
                             JourneyStoreApi._parameter_validation(
                                 helper, a="b", name="mwaside"))

        # calling with incorrect keyword
        self.assertDictEqual(
            dict(mwaside=["This field is not required"]),
            JourneyStoreApi._parameter_validation(helper,
                                                  "b",
                                                  mwaside="mwaside"))

        # calling with incorrect arg
        self.assertDictEqual(
            dict(a=["This field is required"]),
            JourneyStoreApi._parameter_validation(helper, name="mwaside"))

        # check it was not called
        helper('a')
        self.assertEqual(b, 1)
    def test_put_alias_to_save(self, journey_store_save_mock,
                               journey_store_parameter_validation):
        journey_store_parameter_validation.return_value = {}

        JourneyStoreApi(driver_config=self.driver_config).handle_action(
            action="put", name="test_save", journey=self.journey)

        journey_store_save_mock.assert_called_once_with(name="test_save",
                                                        journey=self.journey)
    def test_get_attribute(self, journey_store_parameter_validation,
                           journey_store_init_mock, journey_store_save_mock):
        journey_store_parameter_validation.return_value = {}
        journey_store_init_mock.return_value = None

        JourneyStoreApi(driver_config=self.driver_config).save(
            "test_save", self.journey, random_key_word="random_key_word")

        journey_store_parameter_validation.assert_called_once_with(
            journey_store_save_mock,
            "test_save",
            self.journey,
            random_key_word="random_key_word")

        journey_store_init_mock.assert_called_once_with(
            **self._get_store_config_without_driver_name(self.driver_config), )

        journey_store_save_mock.assert_called_once_with(
            "test_save", self.journey, random_key_word="random_key_word")
    def test_crud(self):
        store = JourneyStoreApi(driver_config=self.driver_config)

        name = "foo"
        version = "0.0.0"

        # save journey
        store.save(name=name, journey=self.journey, version=version)

        journey = store.get(name=name, version=version)
        self.assertEqual(self.journey, journey)

        store.delete(name=name)

        # confirm journey has been deleted
        self.assertRaises(ValidationError,
                          store.get,
                          name=name,
                          version=version)
    def test_handle_action(self):

        store = JourneyStoreApi(driver_config=self.driver_config)

        name = "foo"
        version = "0.0.1"

        # save journey
        store.handle_action(action="save",
                            name=name,
                            journey=self.journey,
                            version=version)

        # get journey that was created
        journey = store.handle_action(action="get", name=name, version=version)
        self.assertEqual(self.journey, journey)

        # create another journey
        journey2 = deepcopy(self.journey)
        journey2["end_screen"]["text"] = "journey 2"
        store.handle_action(action="save",
                            name="bar",
                            journey=journey2,
                            version=version)
        # get journey that was created
        journey = store.handle_action(action="get",
                                      name="bar",
                                      version=version)
        self.assertEqual(journey2, journey)

        # now get all journeys
        journeys = store.handle_action(action="get")
        self.assertDictEqual(
            {
                "foo": {
                    version: self.journey
                },
                "bar": {
                    version: journey2
                }
            }, journeys)

        # delete journey that was created
        store.handle_action(action="delete", name=name)

        # confirm journey has been deleted
        self.assertRaises(ValidationError,
                          store.get,
                          name=name,
                          version=version)

        # validate it action should be provided
        with self.assertRaises(ValidationError) as validation_err:
            # get journey without specifying the action
            store.handle_action(name=name, version=version)

        self.assertDictEqual(dict(action=["This field is required"]),
                             validation_err.exception.normalized_messages())

        # test with invalid action
        with self.assertRaises(ValidationError) as validation_err:
            # get journey with invalid action
            store.handle_action(action="does_not_exist",
                                name=name,
                                version=version)

        self.assertDictEqual(
            dict(action=[
                "action 'does_not_exist' is not allowed, only this methods are allowed; "
                "save, delete, get, all, flush"
            ]), validation_err.exception.normalized_messages())