def test_add_donation_2(): #Add donation from existing donor dc = DonorCollection() dc.add_donation('Jennifer Lee', 150.0) assert dc.lookup_donor('Jennifer Lee') == { 'gift_amounts': [1350.0, 120.17, 150.0] }
def test_has_donor(): dc = DonorCollection() dc.add_donation('Chris Pine', 1.00) assert dc.has_donor('Chris Pine') == 'Chris Pine' assert dc.has_donor('CHRIS PINE') == 'Chris Pine' assert dc.has_donor('chris pine') == 'Chris Pine' assert dc.has_donor('James Dohan') is None
def test_print_report(): dc = DonorCollection() dc.add_donation('William Shatner', 500.25) dc.add_donation('William Shatner', 100.75) dc.add_donation('Harold Tunas', 45.00) report = dc.print_report() assert('Donor Name | Total Given | Num Gifts | Avergage Gift') in report assert('William Shatner $ 601.00 2 $ 300.50') in report assert('Harold Tunas $ 45.00 1 $ 45.00') in report
def add_update_donor(donation_num): global donations first_name = input("Enter donor first name> ") last_name = input("Enter donor last > ") full_name = first_name + ' ' + last_name donation_amount = int(input("Enter a donation amount>")) date = input("Enter a donation date (MM-DD-YYYY)> ") if donation_num == "first": donations = DonorCollection(Donor(full_name, donation_amount, date)) elif donation_num == "add": donations.add_donation(full_name, donation_amount, date)
def test_generate_report(self): dc = DonorCollection() dc.add_donation("first", [111, 222, 333]) dc.add_donation("second", [555]) report = dc.generate_report() assert "first" in report assert "second" in report assert "666" in report # sum of first assert "222" in report # sum of first assert "3" in report # len of first assert "555" in report # sum, avg of second assert "1" in report # len of second
def test_generate_thank_you_letters(self): dc = DonorCollection() dc.add_donation("first", [111, 222, 333]) dc.add_donation("second", [555]) dc.generate_thank_you_letters("testDir") os.path.isfile("testDir\\first.txt") os.path.isfile("testDir\\second.txt") with open("testDir\\first.txt", "r") as f: content = f.read() assert "first" in content assert "666" in content with open("testDir\\second.txt", "r") as f: content = f.read() assert "second" in content assert "555" in content
def test_DonorCollection_class(): dc = DonorCollection() dc.add_new_donor('Bill Gates') with pytest.raises(ValueError): dc.add_new_donor('Bill Gates') dc.add_donation('Bill Gates', 1000.0) d = dc.get_donor('Bill Gates') assert d.num_donations == 1 assert d.total_donations == 1000.0 assert d.donor_name == 'Bill Gates' dc.add_new_donor('Paul Allen') d2 = dc.get_donor('Paul Allen') d2.add_donation(2000.0) assert d2.num_donations == 1 assert d2.total_donations == 2000.0 assert d2.donor_name == 'Paul Allen'
def test_list_donors(): dc = DonorCollection() assert dc.list_donors() == '' dc.add_donation('Patrick Stewart', 10000.00) dc.add_donation('Lavar Burton', 5000.00) dc.add_donation('Michael Dorn', 200.00) assert dc.list_donors() == 'Patrick Stewart\nLavar Burton\nMichael Dorn'
def send_thank_you(donors: DonorCollection) -> None: """Send a thank you note to a Donor. Parameters ---------- donors : DonorCollection DonorCollection to operate on """ # Prompt user for a name while True: name = _get_input( "Enter a full name (or 'list' to list the donors):\n> ", tuple(donors.get_donor_names()) + ('list', ) + _quit_responses, allow_new=True) if name == 'list': print(donors.get_donor_names()) else: # Won't prompt again unless 'list' is entered # If quit, return to calling function if name in _quit_responses: return break # Break out of while loop if a name entered # Request a donation amount amt = _request_donation() if amt is None: # Return to calling function if quit return # Add donation to donor try: donors.add_donation(name, amt) except (ValueError, TypeError): print("Donations must be positive numbers\n") else: # Print thank you note print(f"\n{donors[name].get_thankyou()}\n")
def test_add_donations(self): dc = DonorCollection() dc.add_donation("first", [111, 222, 333]) dc.add_donation("first", [444]) dc.add_donation("second", [555]) assert "first" in dc.donor_data.keys() assert "second" in dc.donor_data.keys() assert len(dc.donor_data) == 2 assert [111, 222, 333, 444] == dc.donor_data["first"].donations assert [555] == dc.donor_data["second"].donations
def test_add_donation(): dc = DonorCollection() dc.add_donation('William Shatner', 500.25) d = dc.get_donor('William Shatner') assert d.name == 'William Shatner' assert d.num_of_donations == 1 assert d.sum_of_donations == 500.25 assert d.average_donation == 500.25 dc.add_donation('William Shatner', 100.75) d = dc.get_donor('William Shatner') assert d.name == 'William Shatner' assert d.num_of_donations == 2 assert d.sum_of_donations == 601.00 assert d.average_donation == 300.50 dc.add_donation('Harold Tunas', 45.00) d = dc.get_donor('Harold Tunas') assert d.name == 'Harold Tunas' assert d.num_of_donations == 1 assert d.sum_of_donations == 45.00 assert d.average_donation == 45.00
#/usr/bin/env python3 import sys import contextlib from io import StringIO from donor_models import Donor, DonorCollection donations = DonorCollection(Donor("Natasha Singer", 120, '02-08-2010')) donations.add_donation("Bob Marquardt", 40, '05-08-1994') def test_send_thank_you(): temp_stdout = StringIO() with contextlib.redirect_stdout(temp_stdout): donations.send_thank_you("Natasha Singer") output = temp_stdout.getvalue().strip() assert "Natasha Singer" in output def test_get_report(): temp_stdout = StringIO() with contextlib.redirect_stdout(temp_stdout): donations.get_report() output = temp_stdout.getvalue().strip() assert "Natasha Singer" in output def test_send_letter_all(): donations.send_letters() with open('Natasha_Singer.txt', 'r') as f: assert "Natasha Singer" in f.read()
class MailroomCli(): """ MailroomCli: command line interface that interacts with DonorCollection """ _exit_mail = False _dc = None def __init__(self): self._dc = DonorCollection() def exit_mail(self): self._exit_mail = True def print_menu(self): print("Object Oriented Mailroom Tasks:\n") print("[1] Send a Thank you to a single donor") print("[2] Send a Thank you to all donors (to stdout)") print("[3] Create a report") print("[4] Send letters to all donors") print("[9] Exit Mailroom\n") def prompt_donor(self): donor_name = input("Enter donor name ('list' for all donors) : ") if donor_name == 'list': namelist = self._dc.list_names() if len(namelist) > 1: print(namelist) donor_name = input("Enter donor name : ") while True: try: donor_amt = input("Enter donation value: ") try: donor_amt = float(donor_amt) break except ValueError: print("Please enter a numeric donation value") except SyntaxError: print("Please enter a valid donation value") try: self._dc.add_new_donor(donor_name) self._dc.add_donation(donor_name, donor_amt) except ValueError: self._dc.add_donation(donor_name, donor_amt) return self._dc.get_donor(donor_name) def send_thankyou_single_donor_task(self): donor = self.prompt_donor() print(donor.generate_thankyou()) def send_thankyou_multiple_donors_task(self): self._dc.generate_thankyou_all() def send_thankyou_multiple_donors_to_file_task(self): filenames = self._dc.generate_thankyou_all_to_file() return filenames def create_report_task(self): print(self._dc.generate_report_all()) _task_dict = { 9: exit_mail, 4: send_thankyou_multiple_donors_to_file_task, 3: create_report_task, 2: send_thankyou_multiple_donors_task, 1: send_thankyou_single_donor_task } def do_tasks(self): while not self._exit_mail: self.print_menu() response = input("Enter Mailroom Option: ") # Validate response try: response = int(response) except ValueError: print("Enter a number between 1-9") continue # Dispatch task based on response try: self._task_dict[response](self) except KeyError: print("Please enter a correct task number") continue
def test_get_donor(): dc = DonorCollection() assert dc.get_donor('Leonard Nimoy') is None dc.add_donation('Leonard Nimoy', 50000.00) assert dc.get_donor('Leonard Nimoy') == Donor('Leonard Nimoy')
def test_add_donation_1(): #New donor dc = DonorCollection() dc.add_donation('Mary Hill', 370.28) assert dc.lookup_donor('Mary Hill') == {'gift_amounts': [370.28]}