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 }