import unittest import os, sys, os.path, time from tempfile import mkdtemp from shutil import rmtree sys.path.append(os.path.join(os.path.dirname(__file__), '..')) from buildlist import addEntriesToListFile class TestBuildList(unittest.TestCase): """ Unit tests for buildlist.py """ def setUp(self): self.tmpdir = mkdtemp() def tearDown(self): rmtree(self.tmpdir) # utility methods for tests def touch(self, file, dir=None): if dir is None: dir = self.tmpdir f = os.path.join(dir, file) open(f, 'w').close() return f def assertFileContains(self, filename, l): """Assert that the lines in the file |filename| are equal to the contents of the list |l|, in order.""" l = l[:] f = open(filename, 'r') lines = [line.rstrip() for line in f.readlines()] f.close() for line in lines: self.assert_(len(l) > 0, "ran out of expected lines! (expected '%s', got '%s')" % (l, lines)) self.assertEqual(line, l.pop(0)) self.assert_(len(l) == 0, "not enough lines in file! (expected '%s', got '%s'" % (l, lines)) def test_basic(self): "Test that addEntriesToListFile works when file doesn't exist." testfile = os.path.join(self.tmpdir, "test.list") l = ["a", "b", "c"] addEntriesToListFile(testfile, l) self.assertFileContains(testfile, l) # ensure that attempting to add the same entries again doesn't change it addEntriesToListFile(testfile, l) self.assertFileContains(testfile, l) def test_append(self): "Test adding new entries." testfile = os.path.join(self.tmpdir, "test.list") l = ["a", "b", "c"] addEntriesToListFile(testfile, l) self.assertFileContains(testfile, l) l2 = ["x","y","z"] addEntriesToListFile(testfile, l2) l.extend(l2) self.assertFileContains(testfile, l) def test_append_some(self): "Test adding new entries mixed with existing entries." testfile = os.path.join(self.tmpdir, "test.list") l = ["a", "b", "c"] addEntriesToListFile(testfile, l) self.assertFileContains(testfile, l) addEntriesToListFile(testfile, ["a", "x", "c", "z"]) self.assertFileContains(testfile, ["a", "b", "c", "x", "z"]) def test_add_multiple(self): """Test that attempting to add the same entry multiple times results in only one entry being added.""" testfile = os.path.join(self.tmpdir, "test.list") addEntriesToListFile(testfile, ["a","b","a","a","b"]) self.assertFileContains(testfile, ["a","b"]) addEntriesToListFile(testfile, ["c","a","c","b","c"]) self.assertFileContains(testfile, ["a","b","c"]) if __name__ == '__main__': unittest.main()