def generateAssertEquals(table, notSelfElement, indent, prefix = ""): asserts = "" index = 0 for column in table.columns: refer = column.getReferenceIfExists(table) name = "" if refer is not None: name ="self.%s.%s"%(generator.asElementName(refer.referToTable), generator.asElementName(refer.referToColumn)) else: if prefix == "": if column.name != notSelfElement: name = "self.%s"%generator.asElementName(column.name) else: name = "_%s"%generator.asElementName(column.name) else: if column.name != notSelfElement: name = "%s.%s"%(prefix, generator.asElementName(column.name)) asserts += "%sself.assertEqual(%s, str(rows[0][%s]))\n"%(" "*8, name, index) index += 1 return asserts
def generateDropTest(tables, table, testIndent): indent = testIndent + 4 identifier = table.columns[0].name idElement = generator.asElementName(identifier) drop = "%sdef\ttestDrop%s(self):\n"%(" " *testIndent, generator.asClassName(table.name)) drop += generator.insertToDB(table, indent) drop += """%sdb.deleteFromTable(self.conn, "%s", %s=self.%s)\n"""%(" "*indent, table.name, identifier, idElement) drop += """%srows = db.selectFrom(self.conn, {"%s"}, "*", %s=self.%s)\n"""%(" "*indent, table.name, identifier, idElement) drop += "%sself.assertEqual(rows, [])\n\n"%(" "*indent) referencingTables = table.getReferencingTables(tables) for refTable in referencingTables: drop += "%sdef\ttestDrop%sBy%s(self):\n"%(" " *testIndent, generator.asClassName(refTable.name), generator.asClassName(table.name)) drop += generator.insertToDB(table, indent) drop += generator.insertToDB(refTable, indent, generator.asElementName(refTable.name)) drop += """%sdb.deleteFromTable(self.conn, "%s", %s=self.%s)\n"""%(" "*indent, table.name, identifier, idElement) drop += """%srows = db.selectFrom(self.conn, {"%s"}, "*", %s=self.%s.%s)\n"""%(" "*indent, refTable.name, refTable.columns[0].name, generator.asElementName(refTable.name), generator.asElementName(refTable.columns[0].name)) drop += "%sself.assertEqual(rows, [])\n\n"%(" "*indent) return drop
def generateDataTypeTest(table, testIndent): indent = testIndent + 4 tests = "" for column in table.columns: tests = "%sdef\ttestInsertInvalid%s(self):\n"%(" " *testIndent, generator.asClassName(column.name)) tests += "%s_%s = %s"%(indent, generator.asElementName(column.name), generator.invalidValueByType(column)) tests += "%sself.assertRaisesRegexp(DataError, self.insert%s ,\n"%(indent, generator.asClassName(table.name)) return tests
def generateUpdateTest(table, testIndent): indent = testIndent + 4 updates = "" for column in table.columns: fk = column.getReferenceIfExists(table) if fk is not None: """ UPDATE TO EXISTING """ updates += "%sdef\ttestUpdateToExisting%s(self):\n"%(" " *testIndent,generator.asClassName(column.name)) elementName = generator.asElementName(column.name) updates += generator.insertToDB(table, indent) +"\n" tableElement = generator.asElementName(table.name) updates += "%s%s = self.%s\n"%(" "*indent, tableElement, tableElement) updates += "%sself.__initDependencies()\n"%(" "*indent) identifier = table.columns[0].name updates += """%sdb.updateInTable(self.conn, {"%s":self.%s}, "%s", %s=%s.%s)\n"""%(" "*indent, column.name, elementName, table.name, identifier, tableElement, generator.asElementName(identifier)) updates += """%srows = db.selectFrom(self.conn, {"%s"}, "*", %s=%s.%s)\n\n"""%(" "*indent, table.name, identifier, tableElement, generator.asElementName(identifier)) updates += generateAssertEquals(table, column.name, indent, tableElement)+"\n" """ UPDATE TO NONE EXISTING """ updates += "%sdef\ttestUpdateToNonExisting%s(self):\n"%(" " *testIndent,generator.asClassName(column.name)) elementName = generator.asElementName(column.name) updates += generator.insertToDB(table, indent) +"\n" tableElement = generator.asElementName(table.name) updates += "%s_%s = mock.%s\n"%(" "*indent, elementName, generator.randomValueByType(column)) identifier = table.columns[0].name updates += """%sself.assertRaisesRegexp(IntegrityError, "foreign key constraint fails",db.updateInTable, self.conn, {"%s":_%s}, "%s", %s=self.%s)\n"""%(" "*indent, column.name, elementName, table.name, identifier, generator.asElementName(identifier)) else: updates += "%sdef\ttestUpdate%s(self):\n"%(" " *testIndent,generator.asClassName(column.name)) elementName = generator.asElementName(column.name) updates += generator.insertToDB(table, indent) +"\n" updates += "%s_%s = mock.%s\n"%(" "*indent, elementName, generator.randomValueByType(column)) identifier = table.columns[0].name updates += """%sdb.updateInTable(self.conn, {"%s":_%s}, "%s", %s=self.%s)\n"""%(" "*indent, column.name, elementName, table.name, identifier, generator.asElementName(identifier)) whereValue = "" if column.name == identifier: whereValue = "_" + elementName else: whereValue = "self." + generator.asElementName(identifier) updates += """%srows = db.selectFrom(self.conn, {"%s"}, "*", %s=%s)\n\n"""%(" "*indent, table.name, identifier, whereValue) updates += generateAssertEquals(table, column.name, indent)+"\n" return updates
def generateMock(tables): content = tables.content mockModule =""" import string import random import uuid as uid import hashlib import datetime def randomText(size=64 , chars=string.ascii_letters + string.digits + string.punctuation): return ''.join(random.choice(chars) for _ in range(random.randint(5, size))) def randomEmail(size=64): return randomText(size - 10) + "@sahabe.de" def randomFixedLengthText(size=64, chars=string.ascii_letters + string.digits + string.punctuation): return ''.join(random.choice(chars) for _ in range(size)) def uuid(): return str(uid.uuid4()) def timeStamp(): timeStamp = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') return str(timeStamp) def SHA2(): return hashlib.sha256(randomText(16)).hexdigest() def MD5(): return hashlib.md5(randomText(16)).hexdigest() class DBMock(): """ init =""" def __init__(self):\n""" for table in content: elementName = generator.asElementName(table.name) className = generator.asClassName(table.name) dependencies = generator.getDependencies(tables, table.name) classArgs = "" for dependency in dependencies: classArgs += "self.%s, "%generator.asElementName(dependency) classArgs = classArgs.rstrip(", ") init +="%sself.%s = DBMock.%s(%s)\n"%(" "*8, elementName, className, classArgs) classes ="" for table in content: elementName = generator.asElementName(table.name) className = generator.asClassName(table.name) dependencies = generator.getDependencies(tables, table.name) classArgs = "" for dependency in dependencies: classArgs += ", %s"%generator.asElementName(dependency) tableClass = """ class %s(object): def __init__(self%s):\n"""%(className, classArgs) elements = "" for column in table.columns: value = "" references = column.getReferenceIfExists(table) if references is not None: value = "%s.%s"%(generator.asElementName(references.referToTable), generator.asElementName(references.referToColumn)) else: value = generator.randomValueByType(column) elements += "%sself.%s = %s\n"%(" "*12, generator.asElementName(column.name), value) tableClass += elements classes += tableClass print "generate Mock class for %s"%className module = open("generated/MockModule.py", "w+") module.write(mockModule+ init+ classes) module.close()