1. Project Clover database Wed Nov 12 2025 05:07:35 UTC
  2. Package guru.mikelue.foxglove.examples

File SettingTest.java

 

Code metrics

2
41
14
2
324
203
15
0.37
2.93
7
1.07

Classes

Class Line # Actions
SettingTest 20 15 0% 7 10
0.565217456.5%
SettingTest.SettingFeatureTest 129 26 0% 8 0
1.0100%
 

Contributing tests

This file is covered by 10 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  11 toggle public SettingTest() {}
22   
 
23  10 toggle @BeforeEach
24    void setup() {}
25   
 
26  10 toggle @AfterEach
27    void tearDown()
28    {
29  10 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    @Nested
 
129    class SettingFeatureTest {
130    /**
131    * Example for setting default supplier by {@link JDBCType} of column.
132    */
 
133  1 toggle @Test
134    void byJdbcType()
135    {
136    // tag::byJdbcType[]
137  1 var dataSetting = new DataSetting()
138    // Sets up fixed text for all VARCHAR columns
139    .givenType(JDBCType.VARCHAR)
140    .useSupplier(() -> "fixed-text");
141    // end::byJdbcType[]
142   
143  1 var testedSupplier = dataSetting
144    .resolveSupplier(
145    newColumnMeta("cr_name", JDBCType.VARCHAR)
146    )
147    .get();
148   
149  1 assertThat(testedSupplier.get())
150    .isEqualTo("fixed-text");
151    }
152   
153    /**
154    * Example for setting default supplier by type name of column.
155    */
 
156  1 toggle @Test
157    void byTypeName()
158    {
159    // tag::byTypeName[]
160  1 var dataSetting = new DataSetting()
161    // Sets up fixed text for columns with type name of "VARYING CHARACTERS"
162    .givenType("VARYING CHARACTERS")
163    .useSupplier(() -> "varying-text");
164    // end::byTypeName[]
165   
166  1 var testedSupplier = dataSetting
167    .resolveSupplier(
168    newColumnMeta("cr_name", "VARYING CHARACTERS", JDBCType.VARCHAR)
169    )
170    .get();
171   
172  1 assertThat(testedSupplier.get())
173    .isEqualTo("varying-text");
174    }
175   
176    /**
177    * Example for setting default supplier by {@link ColumnMatcher}.
178    */
 
179  1 toggle @Test
180    void byColumnMatcher()
181    {
182  1 var addressGen = gen().oneOf(
183    "123 Main St", "456 Oak Ave", "789 Pine Rd"
184    );
185   
186    // tag::byColumnMatcher[]
187  1 var dataSetting = new DataSetting()
188    // Sets up supplier if the name of column contains "address"
189    .columnMatcher(meta -> meta.name().contains("address"))
190    .useSupplier(addressGen);
191    // end::byColumnMatcher[]
192   
193  1 var testedSupplier = dataSetting
194    .resolveSupplier(
195    newColumnMeta("cr_address")
196    )
197    .get();
198   
199  1 assertThat(testedSupplier.get())
200    .isIn("123 Main St", "456 Oak Ave", "789 Pine Rd");
201    }
202   
203    /**
204    * Example for setting exclusion by {@link ColumnMatcher}.
205    */
 
206  1 toggle @Test
207    void excludeWhen()
208    {
209    // tag::excludeWhen[]
210  1 var dataSetting = new DataSetting()
211    // Excludes the column with name ending with "_computed"
212    .excludeWhen(meta -> meta.name().endsWith("_computed"));
213    // end::excludeWhen[]
214   
215  1 assertThat(dataSetting.isAutoGenerating(
216    newColumnMeta("cr_score_computed")
217    ))
218    .isFalse();
219    }
220   
221    /**
222    * Example for setting auto-generating by properties of a column.
223    */
 
224  1 toggle @Test
225    void autoGenerating()
226    {
227    // tag::autoGenerating[]
228  1 var dataSetting = new DataSetting()
229    // Generates value even if the column is AUTO_INCREMENT
230    .autoGenerateFor(Property.AUTO_INCREMENT)
231    // Won't generate value for NULLABLE columns
232    .notAutoGenerateFor(Property.NULLABLE);
233    // end::autoGenerating[]
234   
235  1 assertThat(dataSetting.isAutoGenerating(
236    newColumnMeta("cr_address", Property.NULLABLE)
237    ))
238    .isFalse();
239   
240  1 assertThat(dataSetting.isAutoGenerating(
241    newColumnMeta("cr_address", Property.AUTO_INCREMENT)
242    ))
243    .isTrue();
244    }
245   
246    /**
247    * Example for setting generating of null values on nullable columns.
248    */
 
249  1 toggle @Test
250    void nullable()
251    {
252    // tag::nullValue[]
253  1 var dataSetting = new DataSetting()
254    .givenType(JDBCType.VARCHAR)
255    .useSupplier(() -> "not-null-value")
256    // Generates null value(1/6 odds) for any nullable column
257    .generateNull(true);
258    // end::nullValue[]
259   
260  1 var testedSupplier = dataSetting
261    .resolveSupplier(
262    newColumnMeta("cr_address", JDBCType.VARCHAR, Property.NULLABLE)
263    )
264    .get();
265   
266  1 await()
267    .atMost(5, SECONDS)
268    .untilAsserted(() -> {
269  2 assertThat(testedSupplier.get())
270    .isNull();
271    });
272    }
273   
274    /**
275    * Example for setting generating of null values on nullable columns.
276    */
 
277  1 toggle @Test
278    void customizeOddsForNullValue()
279    {
280    // tag::customizedOddsForNullValue[]
281  1 var dataSetting = new DataSetting()
282    .givenType(JDBCType.VARCHAR)
283    .useSupplier(() -> "not-null-value")
284    // Generates null value(10% odds) for any nullable column
285    .generateNull(10);
286    // end::customizedOddsForNullValue[]
287   
288  1 var testedSupplier = dataSetting
289    .resolveSupplier(
290    newColumnMeta("cr_address", JDBCType.VARCHAR, Property.NULLABLE)
291    )
292    .get();
293   
294  1 await()
295    .atMost(5, SECONDS)
296    .untilAsserted(() -> {
297  8 assertThat(testedSupplier.get())
298    .isNull();
299    });
300    }
301   
302    /**
303    * Example for length of large text settings.
304    */
 
305  1 toggle @Test
306    void largeText()
307    {
308    // tag::largeText[]
309  1 var dataSetting = new DataSetting()
310    // Generates 256 characters for types of TEXT, LONGVARCHAR, etc.
311    .largeTextLength(256);
312    // end::largeText[]
313   
314  1 var testedSupplier = dataSetting
315    .<String>resolveSupplier(
316    newColumnMeta("cr_address", JDBCType.LONGVARCHAR)
317    )
318    .get();
319   
320  1 assertThat(testedSupplier.get())
321    .hasSize(256);
322    }
323    }
324    }