View Javadoc
1   /*
2    *    Copyright 2016-2025 the original author or authors.
3    *
4    *    Licensed under the Apache License, Version 2.0 (the "License");
5    *    you may not use this file except in compliance with the License.
6    *    You may obtain a copy of the License at
7    *
8    *       https://www.apache.org/licenses/LICENSE-2.0
9    *
10   *    Unless required by applicable law or agreed to in writing, software
11   *    distributed under the License is distributed on an "AS IS" BASIS,
12   *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   *    See the License for the specific language governing permissions and
14   *    limitations under the License.
15   */
16  package org.mybatis.dynamic.sql;
17  
18  import static examples.complexquery.PersonDynamicSqlSupport.firstName;
19  import static examples.complexquery.PersonDynamicSqlSupport.id;
20  import static examples.complexquery.PersonDynamicSqlSupport.lastName;
21  import static examples.complexquery.PersonDynamicSqlSupport.person;
22  import static org.assertj.core.api.Assertions.assertThat;
23  import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
24  import static org.mybatis.dynamic.sql.SqlBuilder.countFrom;
25  import static org.mybatis.dynamic.sql.SqlBuilder.deleteFrom;
26  import static org.mybatis.dynamic.sql.SqlBuilder.select;
27  import static org.mybatis.dynamic.sql.SqlBuilder.update;
28  
29  import org.junit.jupiter.api.Test;
30  import org.mybatis.dynamic.sql.delete.DeleteModel;
31  import org.mybatis.dynamic.sql.delete.render.DeleteStatementProvider;
32  import org.mybatis.dynamic.sql.exception.NonRenderingWhereClauseException;
33  import org.mybatis.dynamic.sql.render.RenderingStrategies;
34  import org.mybatis.dynamic.sql.select.SelectModel;
35  import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
36  import org.mybatis.dynamic.sql.update.UpdateModel;
37  import org.mybatis.dynamic.sql.update.render.UpdateStatementProvider;
38  
39  class StatementConfigurationTest {
40      @Test
41      void testCountWhereCalledButNoCriteriaThrowsException() {
42          SelectModel selectModel = countFrom(person)
43                  .where()
44                  .build();
45  
46          assertThatExceptionOfType(NonRenderingWhereClauseException.class).isThrownBy(() ->
47                  selectModel.render(RenderingStrategies.MYBATIS3)
48          );
49      }
50  
51      @Test
52      void testCountWhereCalledButNoCriteriaRequiresConfiguration() {
53          SelectStatementProvider selectStatement = countFrom(person)
54                  .where()
55                  .configureStatement(c -> c.setNonRenderingWhereClauseAllowed(true))
56                  .build()
57                  .render(RenderingStrategies.MYBATIS3);
58  
59          assertThat(selectStatement.getSelectStatement()).isEqualTo("select count(*) from Person");
60      }
61  
62      @Test
63      void testCountWhereNotCalledIsOK() {
64          SelectStatementProvider selectStatement = countFrom(person)
65                  .build()
66                  .render(RenderingStrategies.MYBATIS3);
67  
68          assertThat(selectStatement.getSelectStatement()).isEqualTo("select count(*) from Person");
69      }
70  
71      @Test
72      void testDeleteWhereCalledButNoCriteriaThrowsException() {
73          DeleteModel deleteModel = deleteFrom(person)
74                  .where()
75                  .build();
76  
77          assertThatExceptionOfType(NonRenderingWhereClauseException.class).isThrownBy(() ->
78              deleteModel.render(RenderingStrategies.MYBATIS3)
79          );
80      }
81  
82      @Test
83      void testDeleteWhereCalledButNoCriteriaRequiresConfiguration() {
84          DeleteStatementProvider deleteStatement = deleteFrom(person)
85                  .where()
86                  .configureStatement(c -> c.setNonRenderingWhereClauseAllowed(true))
87                  .build()
88                  .render(RenderingStrategies.MYBATIS3);
89  
90          assertThat(deleteStatement.getDeleteStatement()).isEqualTo("delete from Person");
91      }
92  
93      @Test
94      void testDeleteWhereNotCalledIsOK() {
95          DeleteStatementProvider deleteStatement = deleteFrom(person)
96                  .build()
97                  .render(RenderingStrategies.MYBATIS3);
98  
99          assertThat(deleteStatement.getDeleteStatement()).isEqualTo("delete from Person");
100     }
101 
102     @Test
103     void testSelectWhereCalledButNoCriteriaThrowsException() {
104         SelectModel selectModel = select(id, firstName, lastName)
105                 .from(person)
106                 .where()
107                 .build();
108 
109         assertThatExceptionOfType(NonRenderingWhereClauseException.class).isThrownBy(() ->
110             selectModel.render(RenderingStrategies.MYBATIS3)
111         );
112     }
113 
114     @Test
115     void testSelectWhereCalledButNoCriteriaRequiresConfiguration() {
116         SelectStatementProvider selectStatement = select(id, firstName, lastName)
117                 .from(person)
118                 .where()
119                 .configureStatement(c -> c.setNonRenderingWhereClauseAllowed(true))
120                 .build()
121                 .render(RenderingStrategies.MYBATIS3);
122 
123         assertThat(selectStatement.getSelectStatement())
124                 .isEqualTo("select person_id, first_name, last_name from Person");
125     }
126 
127     @Test
128     void testSelectWhereNotCalledIsOK() {
129         SelectStatementProvider selectStatement = select(id, firstName, lastName)
130                 .from(person)
131                 .build()
132                 .render(RenderingStrategies.MYBATIS3);
133 
134         assertThat(selectStatement.getSelectStatement())
135                 .isEqualTo("select person_id, first_name, last_name from Person");
136     }
137 
138     @Test
139     void testUpdateWhereCalledButNoCriteriaThrowsException() {
140         UpdateModel updateModel = update(person)
141                 .set(id).equalTo(1)
142                 .where()
143                 .build();
144 
145         assertThatExceptionOfType(NonRenderingWhereClauseException.class).isThrownBy(() ->
146             updateModel.render(RenderingStrategies.MYBATIS3)
147         );
148     }
149 
150     @Test
151     void testUpdateWhereCalledButNoCriteriaRequiresConfiguration() {
152         UpdateStatementProvider updateStatement = update(person)
153                 .set(id).equalTo(1)
154                 .where()
155                 .configureStatement(c -> c.setNonRenderingWhereClauseAllowed(true))
156                 .build()
157                 .render(RenderingStrategies.MYBATIS3);
158 
159         assertThat(updateStatement.getUpdateStatement())
160                 .isEqualTo("update Person set person_id = #{parameters.p1}");
161     }
162 
163     @Test
164     void testUpdateWhereNotCalledIsOK() {
165         UpdateStatementProvider updateStatement = update(person)
166                 .set(id).equalTo(1)
167                 .build()
168                 .render(RenderingStrategies.MYBATIS3);
169 
170         assertThat(updateStatement.getUpdateStatement())
171                 .isEqualTo("update Person set person_id = #{parameters.p1}");
172     }
173 }