-1

I made a program which has one function. This function has a file as an input and function writes result to output. I need to test if the my result is the same as expected. Below you can find a code of a program:

import os

def username(input):
    with open(input, 'r') as file:
        if os.stat(input).st_size == 0:
             print('File is empty')
        else:
             print('File is not empty')
             for line in file:
                 count = 1
                 id, first, middle, surname, department = line.split(":")  
                 first1 = first.lower()
                 middle1 = middle.lower()
                 surname1 = surname.lower()
                 username = first1[:1] + middle1[:1] + surname1
                 username1 = username[:8]

                 if username1 not in usernames:
                      usernames.append(username1)
                      data = id + ":" + username1 + ":" + first + ":" + middle + ":" + surname + ":" + department
                 else:
                      username2 = username1 + str(count)
                      usernames.append(username2)
                      data = id + ":" + username2 + ":" + first + ":" + middle + ":" + surname + ":" + department
                      count += 1


                 with open("output.txt", "a+") as username_file:
                      username_file.write(data)


usernames = []

if __name__ == '__main__':
     username("input_file1.txt")
     username("input_file2.txt")
     username("input_file3.txt")
     with open("output.txt", "a+") as username_file:
          username_file.write("\n")

How do I write an unittest on this type of program? I tried this but it gave me this error "TypeError: expected str, bytes or os.PathLike object, not _io.TextIOWrapper" . Code of my test is below:

import unittest
import program.py

class TestProgram(unittest.TestCase):
    def test_username(self):
        i_f = open("input_file1.txt", 'r')
        result = program.username(i_f)
        o_f = open("expected_output.txt", 'r')
        self.assertEqual(result, o_f)

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

I would be really happy if you could help me!!!

kamco
  • 45
  • 6

1 Answers1

0

You didn't read the file, just pass the IO object.

Edit the TestProgram and add .read()

class TestProgram(unittest.TestCase):
    def test_username(self):
        i_f = open("input_file1.txt", 'r').read() # read the file
        result = program.username(i_f)
        o_f = open("expected_output.txt", 'r').read()
        self.assertEqual(result, o_f)

you can also use with-as for automatic closing the file.