Пример #1
0
	def _complete_meal_session_construction_and_save(self, meal_sessions, date_time_to_use):
		"""
		Complete the contruction of the meal sessions
		and save if they do not already exist

		:param meal_sessions (dict): A dictionary with incomplete meal session data
		:param date_time_to_use (datetime): A datetime object to use
		:return:
		"""
		meal_session_date = date(year=date_time_to_use.year,
								 month=date_time_to_use.month,
								 day=date_time_to_use.day)
		meal_sessions['breakfast']['date'] = meal_session_date
		meal_sessions['lunch']['date'] = meal_session_date

		for meal_session in meal_sessions.values():
			# Ignore creation of meal session if one with in the specified
			# time already exists
			if MealSessionLogic.validate_meal_session_times(
				**{
					"name": meal_session.get('name'),
					"date_sent": meal_session.get('date'),
					"location_id": meal_session.get('location_id'),
					"start_time": meal_session.get('start_time'),
					"end_time": meal_session.get('stop_time'),
				}
			):
				continue

			MealSession(**meal_session).save()
Пример #2
0
    def test_create_session_method_succeeds(self, mock_request_params):
        with self.app.app_context():

            new_location = LocationFactory.create(id=1, name="Lagos")

            tz = pytz.timezone("Africa/Lagos")
            self.current_date = datetime.now(tz)

            mock_request_params_return_value = [
                "lunch", "13:10", "14:45", "".join([
                    MealSessionLogic.format_preceding(self.current_date.year),
                    "-",
                    MealSessionLogic.format_preceding(self.current_date.month),
                    "-",
                    MealSessionLogic.format_preceding(self.current_date.day)
                ]), new_location.id
            ]

            mock_request_params.return_value = mock_request_params_return_value

            meal_session_controller = MealSessionController(
                self.request_context)

            response = meal_session_controller.create_session()

            response_json = self.decode_from_json_string(
                response.data.decode('utf-8'))

            self.assertEqual(response.status_code, 201)
            self.assertEqual(response_json['msg'], 'OK')
            self.assertEqual(response_json['payload']['mealSession']['name'],
                             mock_request_params_return_value[0])
            self.assertEqual(
                (response_json['payload']['mealSession']['startTime'])[:-3],
                mock_request_params_return_value[1])
            self.assertEqual(
                (response_json['payload']['mealSession']['stopTime'])[:-3],
                mock_request_params_return_value[2])
            self.assertEqual(response_json['payload']['mealSession']['date'],
                             mock_request_params_return_value[3])
            self.assertEqual(
                response_json['payload']['mealSession']['locationId'],
                mock_request_params_return_value[4])
 def setUp(self):
     self.BaseSetUp()
     self.logic = MealSessionLogic()
     self.base_logic = BaseLogic()
class TestMealSessionLogic(BaseTestCase):
    def setUp(self):
        self.BaseSetUp()
        self.logic = MealSessionLogic()
        self.base_logic = BaseLogic()

    def tearDown(self):
        self.BaseTearDown()

    def test_check_two_values_are_greater_method_returns_true(self):
        return_value = self.logic.check_two_values_are_greater(2, 1)
        self.assertEqual(return_value, True)

    def test_check_two_values_are_greater_returns_false(self):
        return_value = self.logic.check_two_values_are_greater(1, 2)
        self.assertEqual(return_value, False)

    def test_check_two_values_are_greater_method_returns_false(self):
        return_value = self.logic.check_two_values_are_greater(1, 2)
        self.assertEqual(return_value, False)

    def test_format_preceding_returns_correct_formatting(self):
        return_value = self.logic.format_preceding(2)
        self.assertEqual(return_value, "02")

    def test_get_location_time_zone_raises_attribute_error(self):
        return_value = self.base_logic.get_location_time_zone(2)
        self.assertEqual(AttributeError, return_value)

    def test_get_location_time_zone_raises_unknownTimeZoneError(self):
        LocationFactory.create(id=2, name="Uganda")
        return_value = self.base_logic.get_location_time_zone(2)
        self.assertEqual(pytz.exceptions.UnknownTimeZoneError, return_value)

    def test_check_meal_session_exists_in_specified_time_method_returns_true(
            self):
        new_location = LocationFactory.create(name="Lagos")

        tz = pytz.timezone("Africa/Lagos")
        current_date = datetime.now(tz)

        first_meal_session = {
            "name":
            "lunch",
            "start_time":
            time(hour=13, minute=10),
            "end_time":
            time(hour=14, minute=40),
            "date_sent":
            datetime(year=current_date.year,
                     month=current_date.month,
                     day=current_date.day),
            "location_id":
            new_location.id
        }

        MealSessionFactory.create(name="lunch",
                                  start_time=time(hour=13, minute=0),
                                  stop_time=time(hour=14, minute=0),
                                  date=datetime(year=current_date.year,
                                                month=current_date.month,
                                                day=current_date.day),
                                  location=new_location)

        return_value = self.logic.check_meal_session_exists_in_specified_time(
            **first_meal_session)
        self.assertEqual(return_value, True)

    def test_check_meal_session_exists_in_specified_time_method_returns_false(
            self):
        new_location = LocationFactory.create(name="Lagos")

        tz = pytz.timezone("Africa/Lagos")
        current_date = datetime.now(tz)

        first_meal_session = {
            "name":
            "lunch",
            "start_time":
            time(hour=12, minute=10),
            "end_time":
            time(hour=12, minute=40),
            "date_sent":
            datetime(year=current_date.year,
                     month=current_date.month,
                     day=current_date.day),
            "location_id":
            new_location.id
        }

        MealSessionFactory.create(name="lunch",
                                  start_time=time(hour=13, minute=0),
                                  stop_time=time(hour=14, minute=0),
                                  date=datetime(year=current_date.year,
                                                month=current_date.month,
                                                day=current_date.day),
                                  location_id=new_location.id)

        return_value = self.logic.check_meal_session_exists_in_specified_time(
            **first_meal_session)
        self.assertEqual(return_value, False)

    def test_check_encloses_already_existing_meal_sessions_returns_true(self):
        new_location = LocationFactory.create(name="Lagos")

        tz = pytz.timezone("Africa/Lagos")
        current_date = datetime.now(tz)

        first_meal_session = {
            "name":
            "lunch",
            "start_time":
            time(hour=12, minute=10),
            "end_time":
            time(hour=14, minute=40),
            "date_sent":
            datetime(year=current_date.year,
                     month=current_date.month,
                     day=current_date.day),
            "location_id":
            new_location.id
        }

        MealSessionFactory.create(name="lunch",
                                  start_time=time(hour=13, minute=0),
                                  stop_time=time(hour=14, minute=0),
                                  date=datetime(year=current_date.year,
                                                month=current_date.month,
                                                day=current_date.day),
                                  location=new_location)

        return_value = self.logic.check_encloses_already_existing_meal_sessions(
            **first_meal_session)
        self.assertEqual(return_value, True)

    def test_check_encloses_already_existing_meal_sessions_returns_false(self):
        new_location = LocationFactory.create(name="Lagos")

        tz = pytz.timezone("Africa/Lagos")
        current_date = datetime.now(tz)

        first_meal_session = {
            "name":
            "lunch",
            "start_time":
            time(hour=12, minute=10),
            "end_time":
            time(hour=12, minute=40),
            "date_sent":
            datetime(year=current_date.year,
                     month=current_date.month,
                     day=current_date.day),
            "location_id":
            new_location.id
        }

        MealSessionFactory.create(name="lunch",
                                  start_time=time(hour=13, minute=0),
                                  stop_time=time(hour=14, minute=0),
                                  date=datetime(year=current_date.year,
                                                month=current_date.month,
                                                day=current_date.day),
                                  location=new_location)

        return_value = self.logic.check_encloses_already_existing_meal_sessions(
            **first_meal_session)
        self.assertEqual(return_value, False)
 def __init__(self, request):
     BaseController.__init__(self, request)
     self.meal_session_repo = MealSessionRepo()
     self.meal_service_repo = MealServiceRepo()
     self.business_logic = MealSessionLogic()
class MealSessionController(BaseController):
    def __init__(self, request):
        BaseController.__init__(self, request)
        self.meal_session_repo = MealSessionRepo()
        self.meal_service_repo = MealServiceRepo()
        self.business_logic = MealSessionLogic()

    def create_session(self):
        """
        Creates a meal session if all data sent meets specified requirements

        :return: Json Response
        """

        name, start_time, end_time, date, location_id = self.request_params(
            'name', 'startTime', 'endTime', 'date', 'locationId')

        error_message, data = self.business_logic.validate_meal_session_details(
            **{
                "name": name,
                "date": date,
                "location_id": location_id,
                "start_time": start_time,
                "end_time": end_time,
            })

        if error_message:
            return make_response(jsonify({'msg': error_message}), 400)

        new_meal_session = self.meal_session_repo.new_meal_session(
            name=data['name'],
            start_time=data['start_time'],
            stop_time=data['end_time'],
            date=data['date_sent'],
            location_id=data['location_id'])

        new_meal_session.date = new_meal_session.date.strftime("%Y-%m-%d")

        return self.handle_response(
            'OK',
            payload={'mealSession': new_meal_session.serialize()},
            status_code=201)

    def update_session(self, meal_session_id):
        """
        Updates a meal session if all data sent meets specified requirements

        :return: Json Response
        """
        meal_session = self.meal_session_repo.get(meal_session_id)

        if not meal_session:
            return self.handle_response("Meal session Not Found",
                                        status_code=404)

        name, start_time, end_time, date, location_id = self.request_params(
            'name', 'startTime', 'endTime', 'date', 'locationId')

        if not location_id:
            location_id = Auth.get_location()

        meal_session_data = {
            "name": name,
            "start_time": start_time,
            "end_time": end_time,
            "date": date,
            "location_id": location_id,
            "meal_session_id": meal_session.id,
            "meal_session": meal_session,
        }

        validated_data = self.business_logic.validate_update_of_meal_session(
            **meal_session_data)

        error_message = validated_data.get("error_message")

        if error_message:
            return make_response(jsonify({'msg': error_message}), 400)

        meal_session_updated = self.meal_session_repo.update_meal_session(
            meal_session,
            name=validated_data.get("name"),
            start_time=validated_data.get("start_time"),
            stop_time=validated_data.get("end_time"),
            date=validated_data.get("date"),
            location_id=validated_data.get("location_id"))

        meal_session_updated.name = meal_session_updated.name.value

        meal_session_updated.start_time = self.business_logic.get_time_as_string(
            meal_session_updated.start_time.hour,
            meal_session_updated.start_time.minute)

        meal_session_updated.stop_time = self.business_logic.get_time_as_string(
            meal_session_updated.stop_time.hour,
            meal_session_updated.stop_time.minute)

        meal_session_updated.date = meal_session_updated.date.strftime(
            "%Y-%m-%d")

        return self.handle_response(
            'OK',
            payload={'mealSession': meal_session_updated.serialize()},
            status_code=200)

    def list_meal_sessions(self):
        """
        List all meal-sessions in the application, based on provided query
        """
        options = self.get_params_dict()
        options['is_deleted'] = False
        sessions = self.meal_session_repo.filter_by(**options)
        if sessions.items:
            session_list = [session.serialize() for session in sessions.items]
            return self.handle_response('OK',
                                        payload={
                                            'MealSessions': session_list,
                                            'meta':
                                            self.pagination_meta(sessions)
                                        })

        return self.handle_response('No meal sessions found', status_code=404)

    def delete_session(self, meal_session_id):
        """
        Deletes a meal session if correct meal_session_id is sent

        :return: Json Response
        """
        meal_session = self.meal_session_repo.get(meal_session_id)

        if meal_session and not meal_session.is_deleted:
            meal_session = self.meal_session_repo.update(
                meal_session, **dict(is_deleted=True))
            meal_session.name = meal_session.name.value

            meal_session.start_time = self.business_logic.get_time_as_string(
                meal_session.start_time.hour, meal_session.start_time.minute)

            meal_session.stop_time = self.business_logic.get_time_as_string(
                meal_session.stop_time.hour, meal_session.stop_time.minute)

            meal_session.date = meal_session.date.strftime("%Y-%m-%d")

            return self.handle_response(
                'Meal session deleted successfully',
                payload={'mealSession': meal_session.serialize()},
                status_code=200)

        return self.handle_response('Meal Session Not Found', status_code=404)