

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
감사합니다.
'광주인력개발원' 카테고리의 다른 글
키오스크 개발 일지 - 3일차 - [2023-06-17] (0) | 2023.06.22 |
---|---|
키오스크 개발 일지 - 2일차 - [2023-06-16] (0) | 2023.06.22 |
키오스크 개발 계획서 및 개발 일지 - 0일차 - [2023-06-14] (0) | 2023.06.22 |
다시 쓰는 키오스크 분석 - 1일차 [2023-06-09 과제 일지] (0) | 2023.06.09 |
다시 쓰는 키오스크 분석 - 0일차 [2023-06-08 과제 일지] (0) | 2023.06.08 |