Skip to content

Commit 664670e

Browse files
author
synapticloop
committed
Starting sqlite3 testing
1 parent 8d97c1a commit 664670e

5 files changed

Lines changed: 314 additions & 1 deletion

File tree

build.gradle

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,19 @@ dependencies {
4848
testImplementation "junit:junit:4.13.2"
4949
testImplementation "org.mockito:mockito-core:5.6.0"
5050
testImplementation "com.github.stefanbirkner:system-rules:1.17.1"
51+
52+
// this is for the tests
53+
testImplementation('com.mchange:c3p0:0.9.5.5')
54+
testImplementation('com.mchange:mchange-commons-java:0.2.20')
55+
testImplementation('org.xerial:sqlite-jdbc:3.42.0.1')
56+
5157
}
5258

5359
configurations.all {
5460
resolutionStrategy {
5561
failOnVersionConflict()
56-
force "junit:junit:4.13.2"
62+
force "junit:junit:4.13.2",
63+
"com.mchange:mchange-commons-java:0.2.20"
5764
}
5865
}
5966

Lines changed: 185 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,185 @@
1+
package synapticloop.h2zero.generator;
2+
3+
/*
4+
* Copyright (c) 2023 synapticloop.
5+
*
6+
* All rights reserved.
7+
*
8+
* This source code and any derived binaries are covered by the terms and
9+
* conditions of the Licence agreement ("the Licence"). You may not use this
10+
* source code or any derived binaries except in compliance with the Licence.
11+
* A copy of the Licence is available in the file named LICENCE shipped with
12+
* this source code or binaries.
13+
*
14+
* Unless required by applicable law or agreed to in writing, software
15+
* distributed under the Licence is distributed on an "AS IS" BASIS, WITHOUT
16+
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
17+
* Licence for the specific language governing permissions and limitations
18+
* under the Licence.
19+
*/
20+
21+
import synapticloop.h2zero.model.*;
22+
import synapticloop.h2zero.util.SimpleLogger;
23+
import synapticloop.h2zero.util.SimpleLogger.LoggerType;
24+
import synapticloop.templar.Parser;
25+
import synapticloop.templar.exception.FunctionException;
26+
import synapticloop.templar.exception.ParseException;
27+
import synapticloop.templar.exception.RenderException;
28+
import synapticloop.templar.utils.TemplarContext;
29+
30+
import java.io.File;
31+
import java.util.List;
32+
33+
/**
34+
* This class generates all things that are java (i.e. ends in a .java extension)
35+
*
36+
* @author synapticloop
37+
*/
38+
public class JavaTestGenerator extends Generator {
39+
40+
public JavaTestGenerator(Database database, Options options, File outFile, boolean verbose) {
41+
super(database, options, outFile, verbose);
42+
}
43+
44+
@Override
45+
public void generate() throws RenderException, ParseException {
46+
if(!options.hasGenerator(Options.OPTION_TESTS)) {
47+
return;
48+
}
49+
50+
try {
51+
TemplarContext templarContext = getDefaultTemplarContext();
52+
generateTables(templarContext);
53+
generateViews(templarContext);
54+
} catch (FunctionException fex) {
55+
throw new RenderException("Could not instantiate the function.", fex);
56+
}
57+
58+
}
59+
60+
private void generateTables(TemplarContext templarContext) throws ParseException, RenderException {
61+
Parser javaCreateConstantsParser = getParser("/java-create-constants.templar");
62+
63+
// The model
64+
Parser javaCreateModelParser = getParser("/java-create-model.templar");
65+
Parser javaCreateModelStatisticsParser = getParser("/java-create-model-statistics.templar");
66+
67+
// The table actions
68+
Parser javaCreateFinderParser = getParser("/java-create-finder.templar");
69+
Parser javaCreateInserterParser = getParser("/java-create-inserter.templar");
70+
Parser javaCreateCounterParser = getParser("/java-create-counter.templar");
71+
Parser javaCreateQuestionParser = getParser("/java-create-question.templar");
72+
Parser javaCreateUpdaterParser = getParser("/java-create-updater.templar");
73+
Parser javaCreateDeleterParser = getParser("/java-create-deleter.templar");
74+
Parser javaCreateUpserterParser = getParser("/java-create-upserter.templar");
75+
76+
// the select clause bean
77+
Parser javaCreateSelectClauseBeanParser = getParser("/java-create-select-clause-bean.templar");
78+
79+
String pathname = outFile + options.getOutputCode() + database.getPackagePath() + "/model/util/Constants.java";
80+
renderToFile(templarContext, javaCreateConstantsParser, pathname);
81+
82+
pathname = outFile + options.getOutputCode() + database.getPackagePath() + "/model/util/Statistics.java";
83+
renderToFile(templarContext, javaCreateModelStatisticsParser, pathname);
84+
85+
// now for the tables
86+
List<Table> tables = database.getTables();
87+
88+
for (Table table : tables) {
89+
templarContext.add("table", table);
90+
SimpleLogger.logInfo(LoggerType.GENERATE_JAVA, "Generating for table '" + table.getName() + "'.");
91+
92+
// the model
93+
pathname = outFile + options.getOutputCode() + database.getPackagePath() + "/model/" + table.getJavaClassName() + ".java";
94+
renderToFile(templarContext, javaCreateModelParser, pathname);
95+
96+
// the finder
97+
pathname = outFile + options.getOutputCode() + database.getPackagePath() + "/finder/" + table.getJavaClassName() + "Finder.java";
98+
renderToFile(templarContext, javaCreateFinderParser, pathname);
99+
100+
if (!table.getIsConstant()) {
101+
// the inserter
102+
pathname = outFile + options.getOutputCode() + database.getPackagePath() + "/inserter/" + table.getJavaClassName() + "Inserter.java";
103+
renderToFile(templarContext, javaCreateInserterParser, pathname);
104+
105+
// the upserter
106+
pathname = outFile + options.getOutputCode() + database.getPackagePath() + "/upserter/" + table.getJavaClassName() + "Upserter.java";
107+
renderToFile(templarContext, javaCreateUpserterParser, pathname);
108+
}
109+
110+
111+
// the counters
112+
pathname = outFile + options.getOutputCode() + database.getPackagePath() + "/counter/" + table.getJavaClassName() + "Counter.java";
113+
renderToFile(templarContext, javaCreateCounterParser, pathname);
114+
115+
// the questions - we always have an internal question
116+
pathname = outFile + options.getOutputCode() + database.getPackagePath() + "/question/" + table.getJavaClassName() + "Question.java";
117+
renderToFile(templarContext, javaCreateQuestionParser, pathname);
118+
119+
List<Finder> finders = table.getFinders();
120+
121+
for (Finder finder : finders) {
122+
templarContext.add("finder", finder);
123+
124+
// don't forget the beans for the selectClause finders
125+
if (null != finder.getSelectClause()) {
126+
pathname = outFile + options.getOutputCode() + database.getPackagePath() + "/bean/" + table.getJavaClassName() + finder.getTagName() + "Bean.java";
127+
renderToFile(templarContext, javaCreateSelectClauseBeanParser, pathname);
128+
}
129+
}
130+
131+
if (!table.getIsConstant()) {
132+
// the updater
133+
pathname = outFile + options.getOutputCode() + database.getPackagePath() + "/updater/" + table.getJavaClassName() + "Updater.java";
134+
renderToFile(templarContext, javaCreateUpdaterParser, pathname);
135+
136+
// the deleter
137+
pathname = outFile + options.getOutputCode() + database.getPackagePath() + "/deleter/" + table.getJavaClassName() + "Deleter.java";
138+
renderToFile(templarContext, javaCreateDeleterParser, pathname);
139+
}
140+
}
141+
}
142+
143+
private void generateViews(TemplarContext templarContext) throws ParseException, RenderException {
144+
Parser javaCreateViewModelParser = getParser("/java-create-view-model.templar");
145+
Parser javaCreateViewFinderParser = getParser("/java-create-view-finder.templar");
146+
Parser javaCreateSelectClauseBeanParser = getParser("/java-create-select-clause-bean.templar");
147+
Parser javaCreateViewCounterParser = getParser("/java-create-view-counter.templar");
148+
Parser javaCreateViewQuestionParser = getParser("/java-create-view-question.templar");
149+
150+
String pathname;
151+
152+
// now for the views
153+
List<View> views = database.getViews();
154+
for (View view : views) {
155+
templarContext.add("view", view);
156+
157+
// hack for finder taglibs for views - should be split out
158+
templarContext.add("table", view);
159+
160+
String pathPrefix = outFile + options.getOutputCode() + database.getPackagePath();
161+
String viewJavaClassName = view.getJavaClassName();
162+
163+
pathname = pathPrefix + "/view/" + viewJavaClassName + ".java";
164+
renderToFile(templarContext, javaCreateViewModelParser, pathname);
165+
166+
pathname = pathPrefix + "/finder/" + viewJavaClassName + "ViewFinder.java";
167+
renderToFile(templarContext, javaCreateViewFinderParser, pathname);
168+
169+
pathname = pathPrefix + "/counter/" + viewJavaClassName + "ViewCounter.java";
170+
renderToFile(templarContext, javaCreateViewCounterParser, pathname);
171+
172+
pathname = pathPrefix + "/question/" + viewJavaClassName + "ViewQuestion.java";
173+
renderToFile(templarContext, javaCreateViewQuestionParser, pathname);
174+
175+
List<Finder> finders = view.getFinders();
176+
for (Finder finder : finders) {
177+
templarContext.add("finder", finder);
178+
if (null != finder.getSelectClause()) {
179+
pathname = pathPrefix + "/bean/" + finder.getTagName() + "Bean.java";
180+
renderToFile(templarContext, javaCreateSelectClauseBeanParser, pathname);
181+
}
182+
}
183+
}
184+
}
185+
}

src/main/java/synapticloop/h2zero/model/Options.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ public class Options {
4444
public static final String OPTION_BUILD = "build";
4545

4646
public static final String OPTION_JAVA = "java";
47+
public static final String OPTION_TESTS = "tests";
4748
public static final String OPTION_SQL = "sql";
4849
public static final String OPTION_REPORTS = "reports";
4950

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package synapticloop.h2zero.sqlite3;
2+
3+
import static org.junit.Assert.*;
4+
5+
import com.mchange.v2.c3p0.ComboPooledDataSource;
6+
import org.json.JSONException;
7+
import org.json.JSONObject;
8+
import org.junit.After;
9+
import org.junit.Before;
10+
import org.junit.Test;
11+
import synapticloop.h2zero.base.manager.sqlite3.ConnectionManager;
12+
import synapticloop.h2zero.base.manager.BaseConnectionManager;
13+
import synapticloop.sample.h2zero.sqlite3.deleter.AuthorDeleter;
14+
15+
import java.beans.PropertyVetoException;
16+
import java.io.BufferedReader;
17+
import java.io.IOException;
18+
import java.io.InputStreamReader;
19+
import java.sql.Connection;
20+
import java.sql.PreparedStatement;
21+
import java.sql.SQLException;
22+
23+
public class DatabaseTest extends BaseConnectionManager {
24+
private static final String DB_DRIVER_CLASS = "org.sqlite.JDBC";
25+
private static final ComboPooledDataSource comboPooledDataSource = BaseConnectionManager.comboPooledDataSource;
26+
27+
@Before
28+
public void setup() {
29+
// setup the database
30+
try {
31+
comboPooledDataSource.setDriverClass(DB_DRIVER_CLASS);
32+
} catch (PropertyVetoException e) { // runtime exception
33+
throw new RuntimeException(e);
34+
}
35+
// now we need to check for backups and whatnot
36+
37+
comboPooledDataSource.setJdbcUrl("jdbc:sqlite:/test.db");
38+
}
39+
40+
@After
41+
public void teardown() {
42+
AuthorDeleter.deleteAllSilent();
43+
}
44+
45+
@Test
46+
public void createDatabase() {
47+
try {
48+
Connection connection = ConnectionManager.getConnection();
49+
BufferedReader bufferedReader = new BufferedReader(
50+
new InputStreamReader(
51+
DatabaseTest.class.getResourceAsStream("/create-database-sqlite3.sql")));
52+
String line = null;
53+
StringBuilder query = new StringBuilder();
54+
55+
while ((line = bufferedReader.readLine()) != null) {
56+
if (!line.startsWith("--") && !line.trim().isEmpty()) {
57+
query.append(line);
58+
} else {
59+
continue;
60+
}
61+
62+
if (line.trim().endsWith(";")) {
63+
// execute the query and
64+
if (line.trim().isEmpty()) {
65+
// we don't want to run an empty query
66+
continue;
67+
}
68+
PreparedStatement preparedStatement = connection.prepareStatement(query.toString());
69+
preparedStatement.execute();
70+
preparedStatement.close();
71+
query.setLength(0);
72+
}
73+
}
74+
75+
} catch (IOException | SQLException e) {
76+
// TODO - this is going to be a problem
77+
e.printStackTrace();
78+
}
79+
}
80+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package synapticloop.h2zero.sqlite3.finders;
2+
3+
import junit.framework.AssertionFailedError;
4+
import org.junit.After;
5+
import org.junit.Assert;
6+
import org.junit.Test;
7+
import synapticloop.h2zero.sqlite3.DatabaseTest;
8+
import synapticloop.sample.h2zero.sqlite3.finder.AuthorFinder;
9+
import synapticloop.sample.h2zero.sqlite3.inserter.AuthorInserter;
10+
import synapticloop.sample.h2zero.sqlite3.model.Author;
11+
import synapticloop.sample.h2zero.sqlite3.model.AuthorStatus;
12+
13+
import java.sql.SQLException;
14+
import java.util.List;
15+
16+
public class FindAllTest extends DatabaseTest {
17+
@Override
18+
public void setup() {
19+
super.setup();
20+
21+
// now we want to add some authors
22+
AuthorInserter.insertSilent(
23+
null,
24+
"txt_id_author_1",
25+
"txt_nm_author_1",
26+
"txt_nm_username_1",
27+
"txt_bio_1",
28+
"txt_url_cache_image");
29+
}
30+
31+
@Test
32+
public void testFindAll() {
33+
try {
34+
List<Author> authors = AuthorFinder.findAll();
35+
Assert.assertEquals(1, authors.size());
36+
} catch (SQLException e) {
37+
throw new AssertionFailedError("error in SQL generation for AuthorFinder.findAll()");
38+
}
39+
}
40+
}

0 commit comments

Comments
 (0)