1. Project Clover database Fri Jul 17 2026 06:10:26 UTC
  2. Package guru.mikelue.foxglove.examples

File SettingTest.java

 

Code metrics

2
48
15
2
356
225
16
0.33
3.2
7.5
1.07

Classes

Class Line # Actions
SettingTest 20 22 0% 8 10
0.6774193667.7%
SettingTest.SettingFeatureTest 161 26 0% 8 0
1.0100%
 

Contributing tests

This file is covered by 11 tests. .

Source view

1    package guru.mikelue.foxglove.examples;
2   
3    import java.sql.JDBCType;
4   
5    import org.junit.jupiter.api.*;
6   
7    import guru.mikelue.foxglove.ColumnMeta.Property;
8    import guru.mikelue.foxglove.functional.ColumnMatcher;
9    import guru.mikelue.foxglove.jdbc.JdbcDataGenerator;
10    import guru.mikelue.foxglove.jdbc.JdbcTableFacet;
11    import guru.mikelue.foxglove.setting.DataSetting;
12    import guru.mikelue.foxglove.test.AbstractJdbcTestBase;
13   
14    import static guru.mikelue.foxglove.ColumnMetaTestUtils.newColumnMeta;
15    import static guru.mikelue.foxglove.test.SampleSchema.TABLE_CAR;
16    import static java.util.concurrent.TimeUnit.SECONDS;
17    import static org.assertj.core.api.Assertions.assertThat;
18    import static org.awaitility.Awaitility.await;
19   
 
20    public class SettingTest extends AbstractJdbcTestBase {
 
21  12 toggle public SettingTest() {}
22   
 
23  11 toggle @BeforeEach
24    void setup() {}
25   
 
26  11 toggle @AfterEach
27    void tearDown()
28    {
29  11 deleteAll(TABLE_CAR);
30    }
31   
32    /**
33    * Example for versatile setting.
34    */
 
35  1 toggle @Test
36    void versatileSetting()
37    {
38    // tag::versatileSetting[]
39  1 new DataSetting()
40    // Generates 20 rows if no other row number setting on the table
41    .setDefaultNumberOfRows(20)
42    // Excludes columns with name starting with "audit_"
43    .excludeWhen(columnMeta -> columnMeta.name().startsWith("audit_"))
44    // Use column matcher
45    .columnMatcher(columnMeta -> columnMeta.name().endsWith("_status"))
46    // Choose one of the fixed domain values randomly
47    .useSupplier(gen().oneOf("ACTIVE", "INACTIVE", "PENDING"))
48    // For type name
49    .givenType("enum_status")
50    // Choose one of the fixed domain values randomly
51    .useSupplier(gen().oneOf("ACTIVE", "INACTIVE", "UNKNOWN"))
52    // For JDBCType
53    .givenType(JDBCType.VARCHAR)
54    // Fixed value for all VARCHAR columns
55    .useSupplier(() -> "fixed-text")
56    .givenType(JDBCType.INTEGER)
57    // Fixed range for all INTEGER columns
58    .useSpec(() -> gen().ints().range(1000, 1000000))
59    // Generates 128 characters for types of TEXT, LONGVARCHAR, etc.
60    .largeTextLength(128)
61    // Generates null values with 5% odds for all nullable columns
62    .generateNull(20);
63    // end::versatileSetting[]
64    }
65   
66    /**
67    * Example for setting the configuration globally.
68    */
 
69  0 toggle @Test @Disabled
70    void globalSetting()
71    {
72    // tag::globalSetting[]
73  0 DataSetting.defaults()
74    // Generates text with 128 characters for types of TEXT, LONGVARCHAR, etc.
75    .largeTextLength(128)
76    // Generates null values with 10% odds for all nullable columns
77    .generateNull(10);
78    // end::globalSetting[]
79   
80  0 var testedSupplier = DataSetting.defaults()
81    .resolveSupplier(
82    newColumnMeta("nt_addition", JDBCType.LONGVARCHAR, Property.NULLABLE)
83    )
84    .get();
85   
86  0 await()
87    .atMost(5, SECONDS)
88    .untilAsserted(() -> {
89  0 var testedText = (String)testedSupplier.get();
90   
91  0 if (testedText != null) {
92  0 assertThat(testedText)
93    .hasSize(128);
94    }
95   
96    // null value is generated
97  0 assertThat(testedText)
98    .isNull();
99    });
100    }
101   
102    /**
103    * Example for setting on {@link JdbcDataGenerator}.
104    */
 
105  1 toggle @Test
106    void onDataGenerator()
107    {
108    // tag::onDataGenerator[]
109  1 var dataSetting = new DataSetting()
110    // Wont' generate value for NULLABLE column automatically
111    .notAutoGenerateFor(Property.NULLABLE);
112   
113  1 var dataGenerator = new JdbcDataGenerator(getDataSource());
114  1 dataGenerator
115    .withSetting(dataSetting);
116    // end::onDataGenerator[]
117   
118  1 var sampleTable = JdbcTableFacet.builder(TABLE_CAR)
119    .numberOfRows(10)
120    .build();
121   
122  1 dataGenerator.generate(sampleTable);
123   
124  1 assertNumberOfRows(TABLE_CAR, "cr_daily_rate IS NULL")
125    .isEqualTo(10);
126    }
127   
128    /**
129    * Example for setting on for customizing parameter setters for {@link PreparedStatement}.
130    */
 
131  1 toggle @Test
132    void addStatementSetter()
133    {
134    // tag::addStatementSetter[]
135  1 var dataSetting = new DataSetting()
136    .addStatementSetter(
137    meta -> meta.name().equalsIgnoreCase("cr_brand"),
138    (stmt, index, meta, value) -> {
139  10 stmt.setString(index, "CC-" + value);
140    }
141    );
142    // end::addStatementSetter[]
143   
144  1 var dataGenerator = new JdbcDataGenerator(getDataSource());
145  1 dataGenerator
146    .withSetting(dataSetting);
147   
148  1 var sampleTable = JdbcTableFacet.builder(TABLE_CAR)
149    .numberOfRows(10)
150    .column("cr_brand")
151    .useSupplier(gen().string().length(16)::get)
152    .build();
153   
154  1 dataGenerator.generate(sampleTable);
155   
156  1 assertNumberOfRows(TABLE_CAR, "cr_brand LIKE 'CC-%'")
157    .isEqualTo(10);
158    }
159   
160    @Nested
 
161    class SettingFeatureTest {
162    /**
163    * Example for setting default supplier by {@link JDBCType} of column.
164    */
 
165  1 toggle @Test
166    void byJdbcType()
167    {
168    // tag::byJdbcType[]
169  1 var dataSetting = new DataSetting()
170    // Sets up fixed text for all VARCHAR columns
171    .givenType(JDBCType.VARCHAR)
172    .useSupplier(() -> "fixed-text");
173    // end::byJdbcType[]
174   
175  1 var testedSupplier = dataSetting
176    .resolveSupplier(
177    newColumnMeta("cr_name", JDBCType.VARCHAR)
178    )
179    .get();
180   
181  1 assertThat(testedSupplier.get())
182    .isEqualTo("fixed-text");
183    }
184   
185    /**
186    * Example for setting default supplier by type name of column.
187    */
 
188  1 toggle @Test
189    void byTypeName()
190    {
191    // tag::byTypeName[]
192  1 var dataSetting = new DataSetting()
193    // Sets up fixed text for columns with type name of "VARYING CHARACTERS"
194    .givenType("VARYING CHARACTERS")
195    .useSupplier(() -> "varying-text");
196    // end::byTypeName[]
197   
198  1 var testedSupplier = dataSetting
199    .resolveSupplier(
200    newColumnMeta("cr_name", "VARYING CHARACTERS", JDBCType.VARCHAR)
201    )
202    .get();
203   
204  1 assertThat(testedSupplier.get())
205    .isEqualTo("varying-text");
206    }
207   
208    /**
209    * Example for setting default supplier by {@link ColumnMatcher}.
210    */
 
211  1 toggle @Test
212    void byColumnMatcher()
213    {
214  1 var addressGen = gen().oneOf(
215    "123 Main St", "456 Oak Ave", "789 Pine Rd"
216    );
217   
218    // tag::byColumnMatcher[]
219  1 var dataSetting = new DataSetting()
220    // Sets up supplier if the name of column contains "address"
221    .columnMatcher(meta -> meta.name().contains("address"))
222    .useSupplier(addressGen);
223    // end::byColumnMatcher[]
224   
225  1 var testedSupplier = dataSetting
226    .resolveSupplier(
227    newColumnMeta("cr_address")
228    )
229    .get();
230   
231  1 assertThat(testedSupplier.get())
232    .isIn("123 Main St", "456 Oak Ave", "789 Pine Rd");
233    }
234   
235    /**
236    * Example for setting exclusion by {@link ColumnMatcher}.
237    */
 
238  1 toggle @Test
239    void excludeWhen()
240    {
241    // tag::excludeWhen[]
242  1 var dataSetting = new DataSetting()
243    // Excludes the column with name ending with "_computed"
244    .excludeWhen(meta -> meta.name().endsWith("_computed"));
245    // end::excludeWhen[]
246   
247  1 assertThat(dataSetting.isAutoGenerating(
248    newColumnMeta("cr_score_computed")
249    ))
250    .isFalse();
251    }
252   
253    /**
254    * Example for setting auto-generating by properties of a column.
255    */
 
256  1 toggle @Test
257    void autoGenerating()
258    {
259    // tag::autoGenerating[]
260  1 var dataSetting = new DataSetting()
261    // Generates value even if the column is AUTO_INCREMENT
262    .autoGenerateFor(Property.AUTO_INCREMENT)
263    // Won't generate value for NULLABLE columns
264    .notAutoGenerateFor(Property.NULLABLE);
265    // end::autoGenerating[]
266   
267  1 assertThat(dataSetting.isAutoGenerating(
268    newColumnMeta("cr_address", Property.NULLABLE)
269    ))
270    .isFalse();
271   
272  1 assertThat(dataSetting.isAutoGenerating(
273    newColumnMeta("cr_address", Property.AUTO_INCREMENT)
274    ))
275    .isTrue();
276    }
277   
278    /**
279    * Example for setting generating of null values on nullable columns.
280    */
 
281  1 toggle @Test
282    void nullable()
283    {
284    // tag::nullValue[]
285  1 var dataSetting = new DataSetting()
286    .givenType(JDBCType.VARCHAR)
287    .useSupplier(() -> "not-null-value")
288    // Generates null value(1/6 odds) for any nullable column
289    .generateNull(true);
290    // end::nullValue[]
291   
292  1 var testedSupplier = dataSetting
293    .resolveSupplier(
294    newColumnMeta("cr_address", JDBCType.VARCHAR, Property.NULLABLE)
295    )
296    .get();
297   
298  1 await()
299    .atMost(5, SECONDS)
300    .untilAsserted(() -> {
301  2 assertThat(testedSupplier.get())
302    .isNull();
303    });
304    }
305   
306    /**
307    * Example for setting generating of null values on nullable columns.
308    */
 
309  1 toggle @Test
310    void customizeOddsForNullValue()
311    {
312    // tag::customizedOddsForNullValue[]
313  1 var dataSetting = new DataSetting()
314    .givenType(JDBCType.VARCHAR)
315    .useSupplier(() -> "not-null-value")
316    // Generates null value(10% odds) for any nullable column
317    .generateNull(10);
318    // end::customizedOddsForNullValue[]
319   
320  1 var testedSupplier = dataSetting
321    .resolveSupplier(
322    newColumnMeta("cr_address", JDBCType.VARCHAR, Property.NULLABLE)
323    )
324    .get();
325   
326  1 await()
327    .atMost(5, SECONDS)
328    .untilAsserted(() -> {
329  6 assertThat(testedSupplier.get())
330    .isNull();
331    });
332    }
333   
334    /**
335    * Example for length of large text settings.
336    */
 
337  1 toggle @Test
338    void largeText()
339    {
340    // tag::largeText[]
341  1 var dataSetting = new DataSetting()
342    // Generates 256 characters for types of TEXT, LONGVARCHAR, etc.
343    .largeTextLength(256);
344    // end::largeText[]
345   
346  1 var testedSupplier = dataSetting
347    .<String>resolveSupplier(
348    newColumnMeta("cr_address", JDBCType.LONGVARCHAR)
349    )
350    .get();
351   
352  1 assertThat(testedSupplier.get())
353    .hasSize(256);
354    }
355    }
356    }