From e4106b7d230cc173611d0f7eb20e027f1fa63d8e Mon Sep 17 00:00:00 2001 From: Toby Oxborrow Date: Thu, 23 Mar 2017 02:47:56 +0800 Subject: [PATCH] Mocks for chefshow and barcode_generator Add mocks to the unit tests for chefshow and barcode_generator Remove previously added optional arguments to disable costly behaviour of generating barcodes or displaying the window and starting the mainloop. Not needed now they are mocked. Coverage now reports 100% --- barcode_generator.py | 9 ++--- chefshow.py | 5 +-- test_barcode_generator.py | 32 +++++++++------- test_chefshow.py | 81 ++++++++++++++++++++++++++------------- 4 files changed, 80 insertions(+), 47 deletions(-) diff --git a/barcode_generator.py b/barcode_generator.py index 3637cbf..02bc54d 100644 --- a/barcode_generator.py +++ b/barcode_generator.py @@ -22,17 +22,16 @@ def __init__(self): self.count = len(self.codes) self.barcode = None - def jump(self, index, generate_barcode=True): + def jump(self, index): """Skip to a specific code index""" self.index = index self.code = self.codes[self.index] - if generate_barcode: - self.generate_barcode() + self.generate_barcode() return self.code - def next(self, generate_barcode=True): + def next(self): """Move to the next code""" - return self.jump(self.index + 1, generate_barcode) + return self.jump(self.index + 1) def generate_barcode(self): """Generate image of current barcode and return the image object""" diff --git a/chefshow.py b/chefshow.py index cead620..56abcf5 100644 --- a/chefshow.py +++ b/chefshow.py @@ -12,7 +12,7 @@ class ChefShow(SlideShow): """Class to represent the ChefClub barcode slideshow""" - def __init__(self, start_index=None, show=True): + def __init__(self, start_index=None): super().__init__('ChefCodes', self.update_image) self.ccg = BarcodeGenerator() @@ -27,8 +27,7 @@ def __init__(self, start_index=None, show=True): self.back_button.pack(side='bottom') # display the main window and enter the main loop - if show: - self.show() + self.show() def update_image(self): """Change the image that is displayed with the next one""" diff --git a/test_barcode_generator.py b/test_barcode_generator.py index ca175b6..ef7e43b 100644 --- a/test_barcode_generator.py +++ b/test_barcode_generator.py @@ -1,4 +1,4 @@ -import PIL +import treepoem from barcode_generator import BarcodeGenerator @@ -9,56 +9,62 @@ def test_init(): assert bcg.count > 0 -def test_next(): +def test_next(mocker): """Test next function moves index by 1""" + mocker.patch("treepoem.generate_barcode") bcg = BarcodeGenerator() assert bcg.index == 0 - bcg.next(False) + bcg.next() assert bcg.index == 1 assert bcg.code == "001" -def test_jump_1(): +def test_jump_1(mocker): """Test jump function with argument of 1""" + mocker.patch("treepoem.generate_barcode") bcg = BarcodeGenerator() assert bcg.index == 0 - bcg.jump(1, False) + bcg.jump(1) assert bcg.index == 1 assert bcg.code == "001" -def test_jump_10(): +def test_jump_10(mocker): """Test jump function with argument of 10""" + mocker.patch("treepoem.generate_barcode") bcg = BarcodeGenerator() assert bcg.index == 0 - bcg.jump(10, False) + bcg.jump(10) assert bcg.index == 10 assert bcg.code == "00a" -def test_jump_100(): +def test_jump_100(mocker): """Test jump function with argument of 100""" + mocker.patch("treepoem.generate_barcode") bcg = BarcodeGenerator() assert bcg.index == 0 - bcg.jump(100, False) + bcg.jump(100) assert bcg.index == 100 assert bcg.code == "01C" -def test_generate_barcode(): +def test_generate_barcode(mocker): """Test generate_barcode function""" + mocker.patch("treepoem.generate_barcode") bcg = BarcodeGenerator() assert bcg.barcode is None bcg.generate_barcode() - assert isinstance(bcg.barcode, PIL.EpsImagePlugin.EpsImageFile) + assert treepoem.generate_barcode.called is True -def test_jump_generate_barcode(): +def test_jump_generate_barcode(mocker): """Test jump function will generate a barcode""" + mocker.patch("treepoem.generate_barcode") bcg = BarcodeGenerator() assert bcg.index == 0 assert bcg.barcode is None bcg.jump(1) assert bcg.index == 1 assert bcg.code == "001" - assert isinstance(bcg.barcode, PIL.EpsImagePlugin.EpsImageFile) + assert treepoem.generate_barcode.called is True diff --git a/test_chefshow.py b/test_chefshow.py index d9b42b6..27b91be 100644 --- a/test_chefshow.py +++ b/test_chefshow.py @@ -1,45 +1,74 @@ from chefshow import ChefShow +from slideshow import SlideShow -def test_init_callback(): +def test_init_callback(mocker): """Test init function sets the SlideShow callback to update_image""" - chefshow = ChefShow(show=False) + mocker.patch("tkinter.Tk") + mocker.patch("tkinter.Button") + chefshow = ChefShow() + assert chefshow.start_callback == chefshow.update_image -def test_init_title(): +def test_init_title(mocker): """Test init function sets the SlideShow title""" - chefshow = ChefShow(show=False) - assert chefshow.root.title() == "ChefCodes" - + mocker.patch("tkinter.Tk") + mocker.patch("tkinter.Button") + chefshow = ChefShow() -def test_init_bcg(): - """Test init function creates a BarcodeGenerator""" - chefshow = ChefShow(show=False) - assert chefshow.ccg.count > 0 + chefshow.root.title.assert_called_once_with("ChefCodes") -def test_init_jump(): +def test_init_jump(mocker): """Test init function jumps to user specified index""" - chefshow = ChefShow(100, show=False) - assert chefshow.ccg.index == 100 - assert chefshow.ccg.code == "01C" + mocker.patch("tkinter.Tk") + mocker.patch("tkinter.Button") + mocker.patch("treepoem.generate_barcode") + mocker.patch("chefshow.BarcodeGenerator") + chefshow = ChefShow(100) + + chefshow.ccg.jump.assert_called_once_with(100) -def test_update_progress(): +def test_toggle_start_update_progress(mocker): """Test toggle_start function updates the progress label""" - chefshow = ChefShow(99, show=False) - code = chefshow.ccg.next(False) - chefshow.update_progress(code) - label_text = chefshow.progress_label.config('text')[4] - assert label_text == "100 (0.04%): 01C" + mocker.patch("tkinter.Tk") + mocker.patch("tkinter.Button") + mocker.patch("treepoem.generate_barcode") + chefshow = ChefShow() + + mocker.patch("PIL.ImageTk.PhotoImage") + mocker.patch.object(chefshow.ccg, "next", return_value="01C") + mocker.patch.object(chefshow, "update_progress") + mocker.patch.object(chefshow.ccg, "barcode") + chefshow.update_image() + + chefshow.update_progress.assert_called_once_with("01C") + +def test_update_progress(mocker): + """Test update_progress calls SlideShow's update_progress""" + mocker.patch("tkinter.Tk") + mocker.patch("tkinter.Button") + mocker.patch("treepoem.generate_barcode") + chefshow = ChefShow() -def test_jump_back(): + m = mocker.patch.object(SlideShow, "update_progress") + chefshow.update_progress("01C") + + m.assert_called_once_with(0, 238328, '01C') + + +def test_jump_back(mocker): """Test toggle_start function updates the progress label""" - chefshow = ChefShow(100, show=False) - assert chefshow.ccg.index == 100 - assert chefshow.ccg.code == "01C" + mocker.patch("tkinter.Tk") + mocker.patch("tkinter.Button") + mocker.patch("treepoem.generate_barcode") + chefshow = ChefShow(100) + + mocker.patch.object(SlideShow, "update_progress") + mocker.patch.object(chefshow.ccg, "jump") chefshow.jump_back() - assert chefshow.ccg.index == 90 - assert chefshow.ccg.code == "01s" + + chefshow.ccg.jump.assert_called_with(90)