Skip to content

Commit b7a133e

Browse files
committed
ViewModel 테스트 템플릿 생성
1 parent 65103f5 commit b7a133e

13 files changed

+296
-8
lines changed

src/main/kotlin/kr/co/finda/androidtemplate/feature/createFindaTemplate/action/CreateFindaTemplateAction.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,10 @@ import kr.co.finda.androidtemplate.type.PluginError
1111
import kr.co.finda.androidtemplate.feature.createFindaTemplate.dialog.CreateFindaTemplateDialog
1212
import kr.co.finda.androidtemplate.model.ActionRouterImpl
1313

14-
class CreateFindaTemplateAction : AnAction(), CreateFindaTemplateActionContract.View {
14+
class CreateFindaTemplateAction :
15+
AnAction(), CreateFindaTemplateActionContract.View {
1516

16-
private val presenter: CreateFindaTemplateActionPresenter by lazy {
17+
private val presenter: CreateFindaTemplateActionContract.Presenter by lazy {
1718
CreateFindaTemplateActionPresenter(this, ActionRouterImpl())
1819
}
1920

src/main/kotlin/kr/co/finda/androidtemplate/feature/createFindaTemplate/action/CreateFindaTemplateActionPresenter.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,6 @@ class CreateFindaTemplateActionPresenter(
3535
}
3636

3737
private fun isValidSelectedDirectoryPath(path: String): Boolean {
38-
return path.contains("^.*src/main/(java|kotlin).*$".toRegex())
38+
return actionRouter.isCreateFindaTemplateEnable(path)
3939
}
4040
}

src/main/kotlin/kr/co/finda/androidtemplate/feature/createFindaTemplate/dialog/CreateFindaTemplateDialog.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class CreateFindaTemplateDialog(
3737
override fun createCenterPanel(): JComponent {
3838
return panel {
3939

40-
row("화면 이름") {
40+
row("화면 이름:") {
4141
nameTextField = textField({ "" }, {}).component
4242
}
4343

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package kr.co.finda.androidtemplate.feature.createViewModelTest.action
2+
3+
import com.intellij.openapi.actionSystem.AnAction
4+
import com.intellij.openapi.actionSystem.AnActionEvent
5+
import com.intellij.openapi.actionSystem.CommonDataKeys
6+
import com.intellij.openapi.project.Project
7+
import com.intellij.openapi.ui.Messages
8+
import com.intellij.openapi.vfs.VirtualFile
9+
import icons.Icons
10+
import kr.co.finda.androidtemplate.feature.createViewModelTest.dialog.CreateViewModelTestDialog
11+
import kr.co.finda.androidtemplate.model.ActionRouterImpl
12+
import kr.co.finda.androidtemplate.type.PluginError
13+
14+
class CreateViewModelTestAction :
15+
AnAction(), CreateViewModelTestActionContract.View {
16+
17+
private val presenter: CreateViewModelTestActionContract.Presenter by lazy {
18+
CreateViewModelTestActionPresenter(this, ActionRouterImpl())
19+
}
20+
21+
override fun actionPerformed(e: AnActionEvent) {
22+
val project = e.project!!
23+
val selectedDirectory = e.getData(CommonDataKeys.VIRTUAL_FILE)
24+
25+
presenter.onCreateViewModelTestTemplateActionPerformed(project, selectedDirectory)
26+
}
27+
28+
override fun update(event: AnActionEvent) {
29+
val selectedDirectory = event.getData(CommonDataKeys.VIRTUAL_FILE)
30+
presenter.onActionUpdate(event, selectedDirectory)
31+
}
32+
33+
override fun showErrorDialog(project: Project, pluginError: PluginError) {
34+
Messages.showMessageDialog(
35+
project,
36+
pluginError.message,
37+
pluginError.title,
38+
Icons.FindaLogo
39+
)
40+
}
41+
42+
override fun showCreateViewModelTestTemplateDialog(project: Project, selectedDirectory: VirtualFile) {
43+
CreateViewModelTestDialog(project, selectedDirectory).show()
44+
}
45+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package kr.co.finda.androidtemplate.feature.createViewModelTest.action
2+
3+
import com.intellij.openapi.actionSystem.AnActionEvent
4+
import com.intellij.openapi.project.Project
5+
import com.intellij.openapi.vfs.VirtualFile
6+
import kr.co.finda.androidtemplate.type.PluginError
7+
8+
interface CreateViewModelTestActionContract {
9+
10+
interface View {
11+
12+
fun showErrorDialog(project: Project, pluginError: PluginError)
13+
14+
fun showCreateViewModelTestTemplateDialog(project: Project, selectedDirectory: VirtualFile)
15+
}
16+
17+
interface Presenter {
18+
19+
fun onActionUpdate(
20+
event: AnActionEvent,
21+
selectedDirectory: VirtualFile?
22+
)
23+
24+
fun onCreateViewModelTestTemplateActionPerformed(
25+
project: Project,
26+
selectedDirectory: VirtualFile?
27+
)
28+
}
29+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package kr.co.finda.androidtemplate.feature.createViewModelTest.action
2+
3+
import com.intellij.openapi.actionSystem.AnActionEvent
4+
import com.intellij.openapi.project.Project
5+
import com.intellij.openapi.vfs.VirtualFile
6+
import kr.co.finda.androidtemplate.model.ActionRouter
7+
import kr.co.finda.androidtemplate.type.PluginError
8+
9+
class CreateViewModelTestActionPresenter(
10+
private val view: CreateViewModelTestActionContract.View,
11+
private val actionRouter: ActionRouter
12+
) : CreateViewModelTestActionContract.Presenter {
13+
14+
override fun onActionUpdate(
15+
event: AnActionEvent,
16+
selectedDirectory: VirtualFile?
17+
) {
18+
event.presentation.isEnabledAndVisible =
19+
if (selectedDirectory != null) actionRouter.isCreateViewModelTestTemplateEnable(selectedDirectory.path)
20+
else false
21+
}
22+
23+
override fun onCreateViewModelTestTemplateActionPerformed(
24+
project: Project,
25+
selectedDirectory: VirtualFile?
26+
) {
27+
if (selectedDirectory == null) {
28+
view.showErrorDialog(project, PluginError.VTT101)
29+
return
30+
}
31+
32+
if (!actionRouter.isCreateViewModelTestTemplateEnable(selectedDirectory.path)) {
33+
view.showErrorDialog(project, PluginError.VTT102)
34+
return
35+
}
36+
37+
view.showCreateViewModelTestTemplateDialog(project, selectedDirectory)
38+
}
39+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package kr.co.finda.androidtemplate.feature.createViewModelTest.dialog
2+
3+
import com.intellij.openapi.project.Project
4+
import com.intellij.openapi.ui.DialogWrapper
5+
import com.intellij.openapi.ui.Messages
6+
import com.intellij.openapi.vfs.VirtualFile
7+
import com.intellij.ui.components.JBTextField
8+
import com.intellij.ui.layout.panel
9+
import icons.Icons
10+
import kr.co.finda.androidtemplate.model.FileHelperImpl
11+
import kr.co.finda.androidtemplate.model.ReplacerImpl
12+
import kr.co.finda.androidtemplate.type.PluginError
13+
import javax.swing.JComponent
14+
15+
class CreateViewModelTestDialog(
16+
private val project: Project,
17+
private val selectedDirectory: VirtualFile
18+
) : DialogWrapper(true), CreateViewModelTestDialogContract.View {
19+
20+
private val presenter: CreateViewModelTestDialogContract.Presenter by lazy {
21+
CreateViewModelTestDialogPresenter(this, FileHelperImpl(ReplacerImpl()))
22+
}
23+
24+
private lateinit var nameTextField: JBTextField
25+
26+
init {
27+
init()
28+
title = "Create ViewModel Test Template"
29+
}
30+
31+
override fun createCenterPanel(): JComponent {
32+
return panel {
33+
row("ViewModel 이름:") {
34+
nameTextField = textField({ "" }, {}).component
35+
}
36+
}
37+
}
38+
39+
override fun doOKAction() {
40+
presenter.onCreateViewModelTest(
41+
project = project,
42+
name = nameTextField.text,
43+
selectedDirectory = selectedDirectory
44+
)
45+
super.doOKAction()
46+
}
47+
48+
override fun showConflictNameDialog(project: Project, pluginError: PluginError, conflictedFileName: String) {
49+
Messages.showMessageDialog(
50+
project,
51+
"${pluginError.message}\n${conflictedFileName}",
52+
pluginError.title,
53+
Icons.FindaLogo
54+
)
55+
}
56+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package kr.co.finda.androidtemplate.feature.createViewModelTest.dialog
2+
3+
import com.intellij.openapi.project.Project
4+
import com.intellij.openapi.vfs.VirtualFile
5+
import kr.co.finda.androidtemplate.type.PluginError
6+
7+
interface CreateViewModelTestDialogContract {
8+
9+
interface View {
10+
fun showConflictNameDialog(
11+
project: Project,
12+
pluginError: PluginError,
13+
conflictedFileName: String
14+
)
15+
}
16+
17+
interface Presenter {
18+
fun onCreateViewModelTest(
19+
project: Project,
20+
name: String,
21+
selectedDirectory: VirtualFile
22+
)
23+
}
24+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package kr.co.finda.androidtemplate.feature.createViewModelTest.dialog
2+
3+
import com.intellij.openapi.project.Project
4+
import com.intellij.openapi.vfs.VirtualFile
5+
import kr.co.finda.androidtemplate.model.FileHelper
6+
import kr.co.finda.androidtemplate.model.Replacements
7+
import kr.co.finda.androidtemplate.type.FileExtension
8+
import kr.co.finda.androidtemplate.type.PluginError
9+
10+
class CreateViewModelTestDialogPresenter(
11+
private val view: CreateViewModelTestDialogContract.View,
12+
private val fileHelper: FileHelper
13+
) : CreateViewModelTestDialogContract.Presenter {
14+
15+
override fun onCreateViewModelTest(
16+
project: Project,
17+
name: String,
18+
selectedDirectory: VirtualFile
19+
) {
20+
getConflictedFileName(name, selectedDirectory.path)?.let {
21+
view.showConflictNameDialog(project, PluginError.VTT103, it)
22+
return
23+
}
24+
25+
val packageName = fileHelper.getPackageNameByPath(selectedDirectory.path)
26+
createViewModelTest(selectedDirectory, name, packageName)
27+
}
28+
29+
private fun getConflictedFileName(
30+
name: String,
31+
selectedDirectoryPath: String
32+
): String? {
33+
val fileNameWithExtension = "${name}ViewModelTest.kt"
34+
val isFileExist = fileHelper.isFileExistWithPath(
35+
"${selectedDirectoryPath}/${fileNameWithExtension}"
36+
)
37+
38+
return if (isFileExist) {
39+
fileNameWithExtension
40+
} else {
41+
null
42+
}
43+
}
44+
45+
private fun createViewModelTest(
46+
selectedDirectory: VirtualFile,
47+
name: String,
48+
packageName: String
49+
) {
50+
fileHelper.createFileWithTemplate(
51+
selectedDirectory,
52+
"${name}ViewModelTest",
53+
FileExtension.Kotlin,
54+
"ViewModelTestTemplate",
55+
Replacements(
56+
packageName = packageName,
57+
name = name
58+
)
59+
)
60+
}
61+
}

src/main/kotlin/kr/co/finda/androidtemplate/model/ActionRouter.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,16 @@ package kr.co.finda.androidtemplate.model
33
interface ActionRouter {
44

55
fun isCreateFindaTemplateEnable(path: String): Boolean
6+
7+
fun isCreateViewModelTestTemplateEnable(path: String): Boolean
68
}
79

8-
class ActionRouterImpl: ActionRouter {
10+
class ActionRouterImpl : ActionRouter {
911
override fun isCreateFindaTemplateEnable(path: String): Boolean {
1012
return path.contains("src/main/(java|kotlin)".toRegex())
1113
}
14+
15+
override fun isCreateViewModelTestTemplateEnable(path: String): Boolean {
16+
return path.contains("src/test/(java|kotlin)".toRegex())
17+
}
1218
}

0 commit comments

Comments
 (0)