1#!/usr/bin/env python2
2
3"""Run MiddleKit test script."""
4
5from TestCommon import *
6import MiddleKit.Run
7
8
9def test(filename, configFilename, pyFilename, deleteData):
10    curDir = os.getcwd()
11    os.chdir(workDir)
12    try:
13        filename = '../' + filename
14
15        if os.path.splitext(filename)[1] == '':
16            filename += '.mkmodel'
17        pyFilename = os.path.join(filename, pyFilename)
18        if not os.path.exists(pyFilename):
19            print 'No such file', pyFilename
20            return
21
22        print 'Testing %s...' % filename
23
24        # Set up the store
25        names = {}
26        src = 'from MiddleKit.Run.%sObjectStore import %sObjectStore as c' % (dbName, dbName)
27        exec src in names
28        objectStoreClass = names['c']
29        store = objectStoreClass(**storeArgs)
30        store.readModelFileNamed(filename, configFilename=configFilename)
31        assert store.model()._havePythonClasses  # @@
32
33        # Clear the database
34        if deleteData:
35            print 'Deleting all database records for test...'
36            transaction = []
37            for klass in store.model().klasses().values():
38                if not klass.isAbstract():
39                    transaction.append('delete from %s;' % klass.name())
40            ObjectStore.Store.executeSQLTransaction(transaction)
41
42        # Run the test
43        results = {}
44        execfile(pyFilename, results)
45        assert 'test' in results, 'No test defined in %s.' % filename
46        results['test'](store)
47    finally:
48        os.chdir(curDir)
49
50def usage():
51    print 'TestRun.py <model> <config file> <py file> [delete=no|yes]'
52    print
53    sys.exit(1)
54
55def main():
56    if len(sys.argv) < 4:
57        usage()
58
59    modelFilename = sys.argv[1]
60    configFilename = sys.argv[2]
61    pyFilename = sys.argv[3]
62    deleteData = True
63    if len(sys.argv) > 4:
64        delArg = sys.argv[4]
65        parts = delArg.split('=')
66        if len(parts) != 2 or parts[0] != 'delete':
67            usage()
68        deleteData = parts[1].lower() in ('yes', 'true', '1')
69
70    test(modelFilename, configFilename, pyFilename, deleteData)
71
72
73if __name__ == '__main__':
74    try:
75        main()
76    except:
77        import traceback
78        exc_info = sys.exc_info()
79        traceback.print_exception(*exc_info)
80        # print '>> ABOUT TO EXIT WITH CODE 1'
81        sys.exit(1)
82