Skip to content

Commit

Permalink
Mocks for chefshow and barcode_generator
Browse files Browse the repository at this point in the history
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%
  • Loading branch information
tobyoxborrow committed Mar 22, 2017
1 parent 92f3461 commit e4106b7
Show file tree
Hide file tree
Showing 4 changed files with 80 additions and 47 deletions.
9 changes: 4 additions & 5 deletions barcode_generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"""
Expand Down
5 changes: 2 additions & 3 deletions chefshow.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand All @@ -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"""
Expand Down
32 changes: 19 additions & 13 deletions test_barcode_generator.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import PIL
import treepoem

from barcode_generator import BarcodeGenerator

Expand All @@ -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
81 changes: 55 additions & 26 deletions test_chefshow.py
Original file line number Diff line number Diff line change
@@ -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)

0 comments on commit e4106b7

Please sign in to comment.