# Python Tutorial for Beginners - 13. Unit Testing Your Code with the unittest Module

## Run Code 1 in Python

# file: 'app1.py'
return x + y

def subtract(x, y):
"""Subtract Function"""
return x - y

def multiply(x, y):
"""Multiply Function"""
return x * y

def divide(x, y):
"""Divide Function"""
if y == 0:
raise ValueError('Can not divide by zero!')
return x / y


## Run Code 2 in Python

# file: 'app2.py'
import unittest
import calc

class TestCalc(unittest.TestCase):

def test_subtract(self):
self.assertEqual(calc.subtract(10, 5), 5)
self.assertEqual(calc.subtract(-1, 1), -2)
self.assertEqual(calc.subtract(-1, -1), 0)

def test_multiply(self):
self.assertEqual(calc.multiply(10, 5), 50)
self.assertEqual(calc.multiply(-1, 1), -1)
self.assertEqual(calc.multiply(-1, -1), 1)

def test_divide(self):
self.assertEqual(calc.divide(10, 5), 2)
self.assertEqual(calc.divide(-1, 1), -1)
self.assertEqual(calc.divide(-1, -1), 1)
self.assertEqual(calc.divide(5, 2), 2.5)

with self.assertRaises(ValueError):
calc.divide(10, 0)

if __name__ == '__main__':
unittest.main()

##run
#python -m unittest test_calc.py

##doc
#https://docs.python.org/3/library/unittest.html#unittest.TestCase.debug


## Run Code 3 in Python

# file: 'employee.py'

import requests

class Employee:
"""A sample Employee class"""

raise_amt = 1.05

def __init__(self, first, last, pay):
self.first = first
self.last = last
self.pay = pay

@property
def email(self):
return '{}.{}@email.com'.format(self.first, self.last)

@property
def fullname(self):
return '{} {}'.format(self.first, self.last)

def apply_raise(self):
self.pay = int(self.pay * self.raise_amt)

def monthly_schedule(self, month):
response = requests.get(f'http://company.com/{self.last}/{month}')
if response.ok:
return response.text
else:


## Run Code 4 in Python

# file: 'test_employee.py'
import unittest
from employee import Employee

class TestEmployee(unittest.TestCase):

def test_email(self):
emp_1 = Employee('Corey', 'Schafer', 50000)
emp_2 = Employee('Sue', 'Smith', 60000)

self.assertEqual(emp_1.email, 'Corey.Schafer@email.com')
self.assertEqual(emp_2.email, 'Sue.Smith@email.com')

emp_1.first = 'John'
emp_2.first = 'Jane'

self.assertEqual(emp_1.email, 'John.Schafer@email.com')
self.assertEqual(emp_2.email, 'Jane.Smith@email.com')

def test_fullname(self):
emp_1 = Employee('Corey', 'Schafer', 50000)
emp_2 = Employee('Sue', 'Smith', 60000)

self.assertEqual(emp_1.fullname, 'Corey Schafer')
self.assertEqual(emp_2.fullname, 'Sue Smith')

emp_1.first = 'John'
emp_2.first = 'Jane'

self.assertEqual(emp_1.fullname, 'John Schafer')
self.assertEqual(emp_2.fullname, 'Jane Smith')

def test_apply_raise(self):
emp_1 = Employee('Corey', 'Schafer', 50000)
emp_2 = Employee('Sue', 'Smith', 60000)

emp_1.apply_raise()
emp_2.apply_raise()

self.assertEqual(emp_1.pay, 52500)
self.assertEqual(emp_2.pay, 63000)

if __name__ == '__main__':
unittest.main()


## Run Code 5 in Python

# file: 'test_employee.py'
###### With Prints ######

import unittest
from employee import Employee

class TestEmployee(unittest.TestCase):

def setUp(self):
print('setUp')
self.emp_1 = Employee('Corey', 'Schafer', 50000)
self.emp_2 = Employee('Sue', 'Smith', 60000)

def tearDown(self):
print('tearDown\n')

def test_email(self):
print('test_email')
self.assertEqual(self.emp_1.email, 'Corey.Schafer@email.com')
self.assertEqual(self.emp_2.email, 'Sue.Smith@email.com')

self.emp_1.first = 'John'
self.emp_2.first = 'Jane'

self.assertEqual(self.emp_1.email, 'John.Schafer@email.com')
self.assertEqual(self.emp_2.email, 'Jane.Smith@email.com')

def test_fullname(self):
print('test_fullname')
self.assertEqual(self.emp_1.fullname, 'Corey Schafer')
self.assertEqual(self.emp_2.fullname, 'Sue Smith')

self.emp_1.first = 'John'
self.emp_2.first = 'Jane'

self.assertEqual(self.emp_1.fullname, 'John Schafer')
self.assertEqual(self.emp_2.fullname, 'Jane Smith')

def test_apply_raise(self):
print('test_apply_raise')
self.emp_1.apply_raise()
self.emp_2.apply_raise()

self.assertEqual(self.emp_1.pay, 52500)
self.assertEqual(self.emp_2.pay, 63000)

if __name__ == '__main__':
unittest.main()


## Run Code 6 in Python

# file: 'app6.py'
import unittest
from unittest.mock import patch
from employee import Employee

class TestEmployee(unittest.TestCase):

@classmethod
def setUpClass(cls):
print('setupClass')

@classmethod
def tearDownClass(cls):
print('teardownClass')

def setUp(self):
print('setUp')
self.emp_1 = Employee('Corey', 'Schafer', 50000)
self.emp_2 = Employee('Sue', 'Smith', 60000)

def tearDown(self):
print('tearDown\n')

def test_email(self):
print('test_email')
self.assertEqual(self.emp_1.email, 'Corey.Schafer@email.com')
self.assertEqual(self.emp_2.email, 'Sue.Smith@email.com')

self.emp_1.first = 'John'
self.emp_2.first = 'Jane'

self.assertEqual(self.emp_1.email, 'John.Schafer@email.com')
self.assertEqual(self.emp_2.email, 'Jane.Smith@email.com')

def test_fullname(self):
print('test_fullname')
self.assertEqual(self.emp_1.fullname, 'Corey Schafer')
self.assertEqual(self.emp_2.fullname, 'Sue Smith')

self.emp_1.first = 'John'
self.emp_2.first = 'Jane'

self.assertEqual(self.emp_1.fullname, 'John Schafer')
self.assertEqual(self.emp_2.fullname, 'Jane Smith')

def test_apply_raise(self):
print('test_apply_raise')
self.emp_1.apply_raise()
self.emp_2.apply_raise()

self.assertEqual(self.emp_1.pay, 52500)
self.assertEqual(self.emp_2.pay, 63000)

def test_monthly_schedule(self):
with patch('employee.requests.get') as mocked_get:
mocked_get.return_value.ok = True
mocked_get.return_value.text = 'Success'

schedule = self.emp_1.monthly_schedule('May')
mocked_get.assert_called_with('http://company.com/Schafer/May')
self.assertEqual(schedule, 'Success')

mocked_get.return_value.ok = False

schedule = self.emp_2.monthly_schedule('June')
mocked_get.assert_called_with('http://company.com/Smith/June')

if __name__ == '__main__':
unittest.main()
# sudo pip3 install requests