오늘 작성한 테스트 코드
from unittest import TestCase

from class_basket import Basket
from class_db_connect import KioskDBConnector
from class_order import Order


class UnitTest(TestCase):
    def setUp(self):
        # 운영상 DB를 건들이지 않기위해 테스트용 db를 이용함
        self.conn = KioskDBConnector(test_option=True)
        c = self.conn.start_conn()
        c.execute("""delete from tb_order""")
        c.execute("""delete from tb_order_menu""")
        self.conn.commit_db()

    def test_장바구니에_담긴_상품들로_주문을_등록한다_그리고_주문테이블_주문메뉴테이블에_등록된다(self):
        basket = Basket(self.conn)
        basket.add_item(1, [1, 'set', 'large', 'lunch', 35, 65])
        basket.add_item(3, [2, 'set', 'large', 32, 65])
        basket.add_item(45, [2])
        order_1 = Order.create_order(basket, self.conn, True)
        c = self.conn.start_conn()
        fetched_list = c.execute('select * from tb_order').fetchall()
        self.assertEqual(len(fetched_list), 1)

    def test_주문이_담길_때마다_주문번호가_증가한다(self):
        basket = Basket(self.conn)
        basket.add_item(1, [1, 'set', 'large', 'lunch', 35, 65])
        basket.add_item(3, [2, 'set', 'large', 32, 65])
        basket.add_item(45, [2])
        order_1 = Order.create_order(basket, self.conn, True)
        basket.add_item(48, [2])
        order_2 = Order.create_order(basket, self.conn, True)
        order_3 = Order.create_order(basket, self.conn, True)
        order_4 = Order.create_order(basket, self.conn, True)
        c = self.conn.start_conn()
        fetched_list = c.execute('select * from tb_order').fetchall()
        self.assertEqual(len(fetched_list), 4)
        self.assertEqual('0001', str(order_1.order_number))
        self.assertEqual('0002', str(order_2.order_number))
        self.assertEqual('0003', str(order_3.order_number))
        self.assertEqual('0004', str(order_4.order_number))

    def test_00시에_주문번호가_리셋된다(self):
        basket = Basket(self.conn)
        today_day = basket.now_time.day
        basket.now_time = basket.now_time.replace(day=(today_day - 1))
        basket.add_item(1, [1, 'set', 'large', 'lunch', 35, 65])
        basket.add_item(3, [2, 'set', 'large', 32, 65])
        basket.add_item(45, [2])
        order_1 = Order.create_order(basket, self.conn, True)
        order_2 = Order.create_order(basket, self.conn, True)
        basket.now_time = basket.now_time.replace(day=today_day)
        order_3 = Order.create_order(basket, self.conn, True)
        order_4 = Order.create_order(basket, self.conn, True)
        c = self.conn.start_conn()
        fetched_list = c.execute('select * from tb_order').fetchall()
        self.assertEqual(len(fetched_list), 4)
        self.assertEqual('0001', str(order_1.order_number))
        self.assertEqual('0002', str(order_2.order_number))
        self.assertEqual('0001', str(order_3.order_number))
        self.assertEqual('0002', str(order_4.order_number))

    def test_핫케이크_3조각은_사이드메뉴를_안받는다(self):
        basket = Basket(self.conn)
        # 핫케이크 3조각(29), 콜라(65) 세트 주문시 4300원, 바닐라세이크(70)로 음료 주문시 5500원
        basket.add_item(29, [1, 'set', 65])
        order_1 = Order.create_order(basket, self.conn)
        self.assertEqual(order_1.total_price, 4300)

        basket_2 = Basket(self.conn)
        basket_2.add_item(29, [1, 'set', 70])
        order_2 = Order.create_order(basket_2, self.conn)
        self.assertEqual(order_2.total_price, 5500)

    def test_메뉴_리스트를_모두_갖고온다(self):
        menu_list = self.conn.get_menu_list()
        self.assertEqual(len(menu_list), 74)

 

C:\Users\KDT107\Desktop\project_mcdonald_kiosk\venv\Scripts\python.exe "C:/Program Files/JetBrains/PyCharm Community Edition 2022.3.3/plugins/python-ce/helpers/pycharm/_jb_unittest_runner.py" --target test_unit.UnitTest 
Testing started at 오후 9:27 ...
Launching unittests with arguments python -m unittest test_unit.UnitTest in C:\Users\KDT107\Desktop\project_mcdonald_kiosk



Ran 5 tests in 0.211s

OK

Process finished with exit code 0

오늘 만든 도메인 중 Order 와 OrderMenu 클래스

from class_db_connect import KioskDBConnector


class OrderMenu:
    def __init__(self, order_id, menu_id, option, price, conn=None):
        self.order_id = order_id
        self.menu_id = menu_id
        self.option = option
        self.price = price
        self.conn = conn
        conn: KioskDBConnector

    def update_on_DB(self):
        self.conn: KioskDBConnector
        c = self.conn.start_conn()
        option_str = f'{str(self.option)}'
        c.execute('insert into tb_order_menu(order_id, menu_id, option, price) values (?, ?, ?, ?)',
                  (self.order_id, self.menu_id, option_str, self.price))
        self.conn.commit_db()
        self.conn.end_conn()


if __name__ == '__main__':
    connector = KioskDBConnector()
    om_1 = OrderMenu(1, 1, [1, ], connector)
    om_1.update_on_DB()
import datetime
import re
import sqlite3
import time

from class_basket import Basket
from class_db_connect import KioskDBConnector
from class_order_menu import OrderMenu


class Order:

    def __init__(self, order_id, location, order_date, order_status, basket, total_price, order_number, connector,
                 update_to_db_=False):
        assert isinstance(order_date, str) and re.match(r'(\d{4}-\d{1,2}-\d{1,2}\b)', order_date)
        assert isinstance(location, str)
        assert isinstance(order_status, str)
        assert isinstance(basket, Basket)
        assert isinstance(total_price, int) and total_price >= 100
        assert isinstance(connector, KioskDBConnector)

        self.order_id = order_id
        self.order_date = order_date
        self.location = location
        self.order_status = order_status
        self.qr_code_id = basket.qr_code_id
        self.total_price = total_price
        self.order_menu_list = list()
        self.order_number = order_number
        self.conn = connector
        self.basket = basket
        if update_to_db_:
            self.update_on_DB()

    def update_on_DB(self):
        self.conn: KioskDBConnector
        # 로케이션 인덱스 얻기
        c = self.conn.start_conn()
        try:
            location_id = c.execute('select location_id from tb_location').fetchone()[0]
        except Exception:
            location_id = 999
        # 이미 자기 ID가 있는 경우엔 update를 하고 없는 경우엔 Insert를 한다
        if self.order_id is None:
            # 마지막 인덱스 얻기
            try:
                last_index = c.execute('select count(order_id) from tb_order').fetchone()[0]
            except Exception:
                last_index = 1
            self.order_id = last_index + 1
            c.execute(
                'insert into tb_order(order_id, order_date, location_id, ' +
                'order_status_id, qr_code_id, order_number,total_price) values (?, ?, ?, ?, ?, ?, ?)',
                (self.order_id, self.order_date, location_id, 1, self.qr_code_id, self.order_number, self.total_price,))
        else:
            c.execute(
                'update tb_order ' +
                'set order_id = (?), order_date = (?), location_id = (?), ' +
                'order_status_id = (?), qr_code_id =(?), order_number = (?), total_price= (?))',
                (self.order_id, self.order_date, location_id, 1, self.qr_code_id, self.order_number, self.total_price,))
        # TODO: basket 정보 DB에 업데이트하는 로직 필요
        self.conn.commit_db()
        self.conn.end_conn()
        order_menu_list = list()
        for menu_id, option, price in self.basket.get_basket_as_zip():
            order_menu_list.append(OrderMenu(self.order_id, menu_id, option, price, self.conn))
        for order_menu in order_menu_list:
            order_menu.update_on_DB()

    def apply_qr_code(self, code_):
        self.qr_code_id = code_

    def __repr__(self):
        return str(self.__dict__)

    @classmethod
    def create_order(cls, basket, connector, update_to_db_=False):
        # 타임스탬프 저장
        now_time_str = basket.now_time.strftime('%Y-%m-%d %H:%M:%S')

        # 총액 구하기
        total_price = 0
        for menu_id, option_list, item_price in basket.get_basket_as_zip():
            total_price += item_price

        # 주문번호가져오기
        order_number = connector.get_order_number(now_time_str)

        return cls(None, '광주인력개발원점', now_time_str, "ORDERED", basket, total_price, order_number, connector,
                   update_to_db_)

    @classmethod
    def get_one_from_db_by_id(cls, order_id, connector):
        connector: KioskDBConnector
        c = connector.start_conn()

        order_data = c.execute('''
            select order_id,order_date,location_id,order_status_id,qr_code_id,order_number,total_price
            from tb_order where order_id = (?)''', order_id).fetchall()
        connector.end_conn()

        # basket 조립

        return cls(*order_data)


if __name__ == '__main__':
    pass

감사합니다.

+ Recent posts