1 module hibernatetest;
2 
3 import std.stdio;
4 
5 import hibernated.core;
6 
7 import testrunner : Test, BeforeClass, AfterClass;
8 
9 /**
10  * Generic parameters to connect to a database, independent of the driver.
11  */
12 struct ConnectionParams {
13   string host;
14 	ushort port;
15   string database;
16 	string user;
17 	string pass;
18 }
19 
20 /**
21  * A base-class for most hibernate tests. It takes care of setting up and tearing down a connection
22  * to a database using the appropriate driver and connection parameters. Tests annotated with
23  * `@Test` can simply use a session factory to test hibernate queries.
24  */
25 abstract class HibernateTest {
26   ConnectionParams connectionParams;
27   SessionFactory sessionFactory;
28 
29   EntityMetaData buildSchema();
30 
31   Dialect buildDialect() {
32     version (USE_SQLITE) {
33       Dialect dialect = new SQLiteDialect();
34     } else version (USE_MYSQL) {
35       Dialect dialect = new MySQLDialect();
36     } else version (USE_PGSQL) {
37       Dialect dialect = new PGSQLDialect();
38     }
39     return dialect;
40   }
41   DataSource buildDataSource(ConnectionParams connectionParams) {
42     // setup DB connection
43     version( USE_SQLITE )
44     {
45         import ddbc.drivers.sqliteddbc;
46         string[string] params;
47         DataSource ds = new ConnectionPoolDataSourceImpl(new SQLITEDriver(), "zzz.db", params);
48     }
49     else version( USE_MYSQL )
50     {
51         import ddbc.drivers.mysqlddbc;
52         immutable string url = MySQLDriver.generateUrl(
53             connectionParams.host, connectionParams.port, connectionParams.database);
54         string[string] params = MySQLDriver.setUserAndPassword(
55             connectionParams.user, connectionParams.pass);
56         DataSource ds = new ConnectionPoolDataSourceImpl(new MySQLDriver(), url, params);
57     }
58     else version( USE_PGSQL )
59     {
60         import ddbc.drivers.pgsqlddbc;
61         immutable string url = PGSQLDriver.generateUrl(
62             connectionParams.host, connectionParams.port, connectionParams.database); // PGSQLDriver.generateUrl( "/tmp", 5432, "testdb" );
63         string[string] params;
64         params["user"] = connectionParams.user;
65         params["password"] = connectionParams.pass;
66         params["ssl"] = "true";
67 
68         DataSource ds = new ConnectionPoolDataSourceImpl(new PGSQLDriver(), url, params);
69     }
70     return ds;
71   }
72 
73   SessionFactory buildSessionFactory() {
74     DataSource ds = buildDataSource(connectionParams);
75     SessionFactory factory = new SessionFactoryImpl(buildSchema(), buildDialect(), ds);
76 
77     writeln("Creating DB Schema");
78     DBInfo db = factory.getDBMetaData();
79     {
80       Connection conn = ds.getConnection();
81       scope(exit) conn.close();
82       db.updateDBSchema(conn, true, true);
83     }
84     return factory;
85   }
86 
87   void setConnectionParams(ConnectionParams connectionParams) {
88     this.connectionParams = connectionParams;
89   }
90 
91   @BeforeClass
92   void setup() {
93     this.sessionFactory = buildSessionFactory();
94   }
95 
96   @AfterClass
97   void teardown() {
98     this.sessionFactory.close();
99   }
100 }