Skip to content

Commit d4f1c93

Browse files
committed
Add tests for SQL file conversion actions and refactor existing tests
1 parent ad71f4d commit d4f1c93

File tree

6 files changed

+152
-56
lines changed

6 files changed

+152
-56
lines changed
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
/*
2+
* Copyright Doma Tools 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.domaframework.doma.intellij.action.dao
17+
18+
import com.intellij.openapi.fileEditor.FileDocumentManager
19+
import com.intellij.openapi.fileEditor.FileEditorManager
20+
import com.intellij.psi.PsiDocumentManager
21+
import org.domaframework.doma.intellij.DomaSqlTest
22+
23+
abstract class ConvertSqlActionTest : DomaSqlTest() {
24+
protected fun doConvertAction(
25+
daoName: String,
26+
convertFamilyName: String,
27+
sqlConversionPackage: String,
28+
convertActionName: String,
29+
) {
30+
addDaoJavaFile("$sqlConversionPackage/$daoName.java")
31+
32+
val daoClass = findDaoClass("$sqlConversionPackage.$daoName")
33+
myFixture.configureFromExistingVirtualFile(daoClass.containingFile.virtualFile)
34+
println("convertActionName: $convertActionName")
35+
val intention = myFixture.findSingleIntention(convertActionName)
36+
37+
assertNotNull(
38+
"$convertActionName intention should be available",
39+
intention,
40+
)
41+
assertEquals(convertActionName, intention.text)
42+
assertEquals(convertFamilyName, intention.familyName)
43+
44+
myFixture.launchAction(intention)
45+
myFixture.checkResultByFile("java/doma/example/dao/$sqlConversionPackage/$daoName.after.java")
46+
}
47+
48+
protected fun doConvertActionTest(
49+
daoName: String,
50+
sqlToAnnotationPackage: String,
51+
convertFamilyName: String,
52+
) {
53+
addDaoJavaFile("$sqlToAnnotationPackage/$daoName.java")
54+
val daoClass = findDaoClass("$sqlToAnnotationPackage.$daoName")
55+
myFixture.configureFromExistingVirtualFile(daoClass.containingFile.virtualFile)
56+
57+
val intentions = myFixture.availableIntentions
58+
val convertIntention = intentions.find { it is ConvertSqlFileToAnnotationAction }
59+
60+
assertNull("$convertFamilyName intention should NOT be available without @Sql annotation", convertIntention)
61+
}
62+
63+
protected fun doTestSqlFormat(
64+
daoName: String,
65+
sqlFileName: String,
66+
sqlConversionPackage: String,
67+
isScript: Boolean = false,
68+
) {
69+
val openedEditor = FileEditorManager.getInstance(project).selectedEditors
70+
val extension = if (isScript) "script" else "sql"
71+
val openSqlFile = openedEditor.find { it.file.name == sqlFileName.substringAfter("/").plus(".$extension") }
72+
73+
if (openSqlFile != null) {
74+
fail("SQL file $sqlFileName.$extension should be opened after conversion")
75+
return
76+
}
77+
// If the generated `PsiFile` has an associated `Document`, explicitly reload it to ensure memory–disk consistency.
78+
// If not reloaded, the test may produce: *Unexpected memory–disk conflict in tests for*.
79+
val fdm = FileDocumentManager.getInstance()
80+
fdm.saveAllDocuments()
81+
PsiDocumentManager.getInstance(project).commitAllDocuments()
82+
83+
val newSqlFile = findSqlFile("$sqlConversionPackage/$daoName/$sqlFileName.$extension")
84+
if (newSqlFile == null) {
85+
fail("Not Found $sqlFileName.$extension")
86+
return
87+
}
88+
fdm.getDocument(newSqlFile)?.let { fdm.reloadFromDisk(it) }
89+
myFixture.configureFromExistingVirtualFile(newSqlFile)
90+
myFixture.checkResultByFile("resources/META-INF/doma/example/dao/$sqlConversionPackage/$daoName/$sqlFileName.after.$extension")
91+
}
92+
}

src/test/kotlin/org/domaframework/doma/intellij/action/dao/ConvertSqlAnnotationToFileActionTest.kt

Lines changed: 16 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,9 @@
1515
*/
1616
package org.domaframework.doma.intellij.action.dao
1717

18-
import com.intellij.openapi.fileEditor.FileDocumentManager
1918
import com.intellij.openapi.fileEditor.FileEditorManager
20-
import com.intellij.psi.PsiDocumentManager
21-
import org.domaframework.doma.intellij.DomaSqlTest
2219

23-
class ConvertSqlAnnotationToFileActionTest : DomaSqlTest() {
20+
class ConvertSqlAnnotationToFileActionTest : ConvertSqlActionTest() {
2421
private val sqlConversionPackage = "sqltofile"
2522
private val convertActionName = "Convert to SQL file (set sqlFile=true)"
2623
private val convertFamilyName = "Convert @Sql annotation to SQL file"
@@ -112,54 +109,31 @@ class ConvertSqlAnnotationToFileActionTest : DomaSqlTest() {
112109

113110
fun testIntentionNotAvailableForMethodWithoutSqlAnnotation() {
114111
val daoName = "NoSqlAnnotationDao"
115-
addDaoJavaFile("$sqlConversionPackage/$daoName.java")
116-
val daoClass = findDaoClass("$sqlConversionPackage.$daoName")
117-
myFixture.configureFromExistingVirtualFile(daoClass.containingFile.virtualFile)
118-
119-
val intentions = myFixture.availableIntentions
120-
val convertIntention = intentions.find { it is ConvertSqlAnnotationToFileAction }
121-
122-
assertNull("$convertFamilyName intention should NOT be available without @Sql annotation", convertIntention)
112+
doConvertActionTest(daoName, sqlConversionPackage, convertFamilyName)
123113
}
124114

125115
fun testIntentionNotAvailableForUnsupportedAnnotation() {
126116
val daoName = "UnsupportedAnnotationDao"
127-
addDaoJavaFile("$sqlConversionPackage/$daoName.java")
128-
val daoClass = findDaoClass("$sqlConversionPackage.$daoName")
129-
myFixture.configureFromExistingVirtualFile(daoClass.containingFile.virtualFile)
130-
131-
val intentions = myFixture.availableIntentions
132-
val convertIntention = intentions.find { it is ConvertSqlAnnotationToFileAction }
133-
134-
assertNull("$convertFamilyName intention should NOT be available without @Sql annotation", convertIntention)
117+
doConvertActionTest(daoName, sqlConversionPackage, convertFamilyName)
135118
}
136119

137120
private fun doTest(
138121
daoName: String,
139122
sqlFileName: String,
140123
isScript: Boolean = false,
141124
) {
142-
addDaoJavaFile("$sqlConversionPackage/$daoName.java")
143-
144-
val daoClass = findDaoClass("$sqlConversionPackage.$daoName")
145-
myFixture.configureFromExistingVirtualFile(daoClass.containingFile.virtualFile)
146-
val intention = myFixture.findSingleIntention(convertActionName)
147-
148-
assertNotNull(
149-
"$convertActionName intention should be available",
150-
intention,
125+
doConvertAction(
126+
daoName,
127+
convertFamilyName,
128+
sqlConversionPackage,
129+
convertActionName,
151130
)
152-
assertEquals(convertActionName, intention.text)
153-
assertEquals(convertFamilyName, intention.familyName)
154-
155-
myFixture.launchAction(intention)
156-
myFixture.checkResultByFile("java/doma/example/dao/$sqlConversionPackage/$daoName.after.java")
157131

158132
// Test SQL File Generation
159133
val sqlFile = "$sqlFileName.${if (isScript) "script" else "sql"}"
160134
val openedEditor = FileEditorManager.getInstance(project).selectedEditors
161-
assertTrue(
162-
"Open File is Not $sqlFileName",
135+
assertFalse(
136+
"Open File is $sqlFileName",
163137
openedEditor.any { it.file.name == sqlFile.substringAfter("/") },
164138
)
165139

@@ -172,22 +146,11 @@ class ConvertSqlAnnotationToFileActionTest : DomaSqlTest() {
172146
sqlFileName: String,
173147
isScript: Boolean = false,
174148
) {
175-
val openedEditor = FileEditorManager.getInstance(project).selectedEditors
176-
val extension = if (isScript) "script" else "sql"
177-
val sqlFile = openedEditor.find { it.file.name == sqlFileName.substringAfter("/").plus(".$extension") }
178-
179-
if (sqlFile == null) {
180-
fail("SQL file $sqlFileName.$extension should be opened after conversion")
181-
return
182-
}
183-
// If the generated `PsiFile` has an associated `Document`, explicitly reload it to ensure memory–disk consistency.
184-
// If not reloaded, the test may produce: *Unexpected memory–disk conflict in tests for*.
185-
val fdm = FileDocumentManager.getInstance()
186-
fdm.saveAllDocuments()
187-
PsiDocumentManager.getInstance(project).commitAllDocuments()
188-
fdm.getDocument(sqlFile.file)?.let { fdm.reloadFromDisk(it) }
189-
190-
myFixture.configureFromExistingVirtualFile(sqlFile.file)
191-
myFixture.checkResultByFile("resources/META-INF/doma/example/dao/$sqlConversionPackage/$daoName/$sqlFileName.after.$extension")
149+
doTestSqlFormat(
150+
daoName,
151+
sqlFileName,
152+
sqlConversionPackage,
153+
isScript,
154+
)
192155
}
193156
}

src/test/kotlin/org/domaframework/doma/intellij/action/dao/ConvertSqlFileToAnnotationActionTest.kt

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,8 @@ package org.domaframework.doma.intellij.action.dao
1717

1818
import com.intellij.openapi.fileEditor.FileDocumentManager
1919
import com.intellij.psi.PsiDocumentManager
20-
import org.domaframework.doma.intellij.DomaSqlTest
2120

22-
class ConvertSqlFileToAnnotationActionTest : DomaSqlTest() {
21+
class ConvertSqlFileToAnnotationActionTest : ConvertSqlActionTest() {
2322
private val sqlToAnnotationPackage = "sqltoannotation"
2423
private val convertActionName = "Convert to @Sql annotation (set sqlFile=false)"
2524
private val convertFamilyName = "Convert SQL file to @Sql annotation"
@@ -87,7 +86,10 @@ class ConvertSqlFileToAnnotationActionTest : DomaSqlTest() {
8786
val intentions = myFixture.availableIntentions
8887
val convertIntention = intentions.find { it is ConvertSqlFileToAnnotationAction }
8988

90-
assertNull("$convertFamilyName intention should NOT be available when @Sql annotation already exists", convertIntention)
89+
assertNull(
90+
"$convertFamilyName intention should NOT be available when @Sql annotation already exists",
91+
convertIntention,
92+
)
9193
}
9294

9395
fun testIntentionNotAvailableForMethodWithoutSqlFile() {
@@ -108,6 +110,15 @@ class ConvertSqlFileToAnnotationActionTest : DomaSqlTest() {
108110
doTest(daoName, sqlFileName)
109111
}
110112

113+
fun testSelectWithSqlFileConvertAnnotation() {
114+
val daoName = "SelectWithSqlFileConvertAnnotationDao"
115+
val sqlFileName = "selectEmployee.sql"
116+
doConvertActionTest(daoName, sqlToAnnotationPackage, convertFamilyName)
117+
// Test SQL File Removed
118+
val generatedSql = findSqlFile("$sqlToAnnotationPackage/$daoName/$sqlFileName")
119+
assertTrue("SQL File [$sqlFileName] should exists ", generatedSql == null)
120+
}
121+
111122
private fun doTest(
112123
daoName: String,
113124
sqlFileName: String,
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package doma.example.dao.sqltoannotation;
2+
3+
import doma.example.entity.Employee;
4+
import org.seasar.doma.Dao;
5+
import org.seasar.doma.Select;
6+
7+
@Dao
8+
public interface SelectWithSqlFileConvertAnnotationDao {
9+
@Select
10+
@Sql("""
11+
SELECT *
12+
FROM employee
13+
WHERE id = /* id */1
14+
""")
15+
Employee selectEmployee(int id);
16+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package doma.example.dao.sqltoannotation;
2+
3+
import doma.example.entity.Employee;
4+
import org.seasar.doma.Dao;
5+
import org.seasar.doma.Select;
6+
7+
@Dao
8+
public interface SelectWithSqlFileConvertAnnotationDao {
9+
@Select
10+
Employee select<caret>Employee(int id);
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
SELECT *
2+
FROM employee
3+
WHERE id = /* id */1

0 commit comments

Comments
 (0)