annotate sqlpython/test_sqlpyPlus.py @ 189:c5398d87498e

cat bug
author catherine@dellzilla
date Mon, 17 Nov 2008 14:26:53 -0500
parents
children
rev   line source
189
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
1 import unittest, sys, tempfile, re, os.path, pyparsing
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
2 from sqlpyPlus import *
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
3
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
4 class Borg(object):
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
5 # from Python Cookbook, 2nd Ed., recipe 6.16
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
6 _shared_state = {}
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
7 def __new__(cls, *a, **k):
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
8 obj = object.__new__(cls, *a, **k)
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
9 obj.__dict__ = cls._shared_state
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
10 return obj
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
11
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
12 class OutputTrap(Borg):
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
13 old_stdout = sys.stdout
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
14 def __init__(self):
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
15 self.trap = tempfile.TemporaryFile()
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
16 sys.stdout = self.trap
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
17 def dump(self):
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
18 self.trap.seek(0)
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
19 result = self.trap.read()
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
20 self.trap.close()
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
21 self.trap = tempfile.TemporaryFile()
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
22 sys.stdout = self.trap
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
23 return result
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
24 def teardown(self):
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
25 sys.stdout = self.old_stdout
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
26
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
27 class TestSqlPyPlus(unittest.TestCase):
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
28 transcriptReader = re.compile('testdata@eqdev> (.*?)\n(.*?)(?=testdata@eqdev>)', re.DOTALL)
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
29 transcriptFileName = 'test_sqlpyPlus.txt'
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
30 def setUp(self):
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
31 self.outputTrap = OutputTrap()
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
32 transcriptFile = open(self.transcriptFileName)
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
33 self.transcript = transcriptFile.read()
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
34 transcriptFile.close()
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
35 self.directives = self.transcriptReader.finditer(self.transcript)
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
36 self.testsession = sqlpyPlus()
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
37 self.testsession.onecmd('connect ' + connectString)
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
38 self.transcriptReader = re.compile(
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
39 '%s(.*?)\n\n(.*?)(?=%s)' % (self.testsession.prompt, self.testsession.prompt), re.DOTALL)
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
40 self.commandCleaner = '\n%s' % (self.testsession.continuationPrompt)
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
41 def assertOutput(self, commandtext, expected, lineNum):
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
42 self.testsession.onecmd(commandtext)
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
43 result = self.outputTrap.dump()
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
44 self.assertEqual(expected.strip(), result.strip(),
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
45 '\nFile %s, line %d\nCommand was:\n%s\nExpected:\n%s\nGot:\n%s\n' %
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
46 (self.transcriptFileName, lineNum, commandtext, expected, result))
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
47 def testall(self):
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
48 for directive in self.directives:
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
49 (command, result) = directive.groups()
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
50 command = command.replace(self.commandCleaner, '\n')
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
51 self.assertOutput(command, result, lineNum=self.transcript.count('\n', 0, directive.start()))
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
52 def tearDown(self):
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
53 self.outputTrap.teardown()
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
54
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
55 try:
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
56 connectString = sys.argv.pop(1)
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
57 except IndexError:
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
58 print 'Usage: python %s username/password@oracleSID' % os.path.split(__file__)[-1]
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
59 sys.exit()
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
60 unittest.main()
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
61
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
62
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
63 def transcript(cmdapp, filename='test_sqlpyPlus.txt'):
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
64 tfile = open(filename)
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
65 txt = tfile.read()
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
66 tfile.close()
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
67 prompt = pyparsing.Suppress(pyparsing.lineStart + cmd.prompt)
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
68 continuationPrompt = pyparsing.Suppress(pyparsing.lineStart + cmd.continuationPrompt)
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
69 cmdtxtPattern = (prompt + pyparsing.restOfLine + pyparsing.ZeroOrMore(
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
70 pyparsing.lineEnd + continuationPrompt + pyparsing.restOfLine))("command")
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
71 previousStartPoint = 0
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
72 results = []
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
73 for onecmd in cmdtxtPattern.scanString(txt):
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
74 if len(results) > 0:
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
75 results[-1]['response'] = txt[previousStartPoint:onecmd[1]]
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
76 results.append({'command': ''.join(onecmd[0].command), 'response': txt[onecmd[2]:]})
c5398d87498e cat bug
catherine@dellzilla
parents:
diff changeset
77 previousStartPoint = onecmd[2]