Skip to content

Commit b3288b3

Browse files
committed
test: add unit tests for ClassApiExporterHelper
1 parent a020e49 commit b3288b3

File tree

3 files changed

+149
-50
lines changed

3 files changed

+149
-50
lines changed

idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/ClassApiExporterHelper.kt

Lines changed: 27 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -31,25 +31,25 @@ import java.util.concurrent.LinkedBlockingQueue
3131
open class ClassApiExporterHelper {
3232

3333
@Inject
34-
protected val jvmClassHelper: JvmClassHelper? = null
34+
protected lateinit var jvmClassHelper: JvmClassHelper
3535

3636
@Inject
37-
protected val ruleComputer: RuleComputer? = null
37+
protected lateinit var ruleComputer: RuleComputer
3838

3939
@Inject
40-
private val docHelper: DocHelper? = null
40+
private lateinit var docHelper: DocHelper
4141

4242
@Inject
43-
protected val psiClassHelper: PsiClassHelper? = null
43+
protected lateinit var psiClassHelper: PsiClassHelper
4444

4545
@Inject
46-
private val linkExtractor: LinkExtractor? = null
46+
private lateinit var linkExtractor: LinkExtractor
4747

4848
@Inject
49-
private val linkResolver: LinkResolver? = null
49+
private lateinit var linkResolver: LinkResolver
5050

5151
@Inject
52-
protected val duckTypeHelper: DuckTypeHelper? = null
52+
protected lateinit var duckTypeHelper: DuckTypeHelper
5353

5454
@Inject
5555
protected lateinit var actionContext: ActionContext
@@ -58,7 +58,7 @@ open class ClassApiExporterHelper {
5858
protected lateinit var logger: Logger
5959

6060
@Inject
61-
protected val classExporter: ClassExporter? = null
61+
protected lateinit var classExporter: ClassExporter
6262

6363
@Inject
6464
protected lateinit var messagesHelper: MessagesHelper
@@ -69,7 +69,7 @@ open class ClassApiExporterHelper {
6969
companion object : Log()
7070

7171
fun extractParamComment(psiMethod: PsiMethod): MutableMap<String, Any?>? {
72-
val subTagMap = docHelper!!.getSubTagMapOfDocComment(psiMethod, "param")
72+
val subTagMap = docHelper.getSubTagMapOfDocComment(psiMethod, "param")
7373
if (subTagMap.isEmpty()) {
7474
return null
7575
}
@@ -82,36 +82,34 @@ open class ClassApiExporterHelper {
8282
if (value.notNullOrBlank()) {
8383

8484
val options: ArrayList<HashMap<String, Any?>> = ArrayList()
85-
val comment = linkExtractor!!.extract(value, psiMethod, object : AbstractLinkResolve() {
85+
val comment = linkExtractor.extract(value, psiMethod, object : AbstractLinkResolve() {
8686

8787
override fun linkToPsiElement(plainText: String, linkTo: Any?): String? {
88-
89-
psiClassHelper!!.resolveEnumOrStatic(
88+
psiClassHelper.resolveEnumOrStatic(
9089
plainText,
9190
parameters.firstOrNull { it.name == name } ?: psiMethod,
9291
name
93-
)
94-
?.let { options.addAll(it) }
92+
)?.let { options.addAll(it) }
9593

9694
return super.linkToPsiElement(plainText, linkTo)
9795
}
9896

9997
override fun linkToClass(plainText: String, linkClass: PsiClass): String? {
100-
return linkResolver!!.linkToClass(linkClass)
98+
return linkResolver.linkToClass(linkClass)
10199
}
102100

103101
override fun linkToType(plainText: String, linkType: PsiType): String? {
104-
return jvmClassHelper!!.resolveClassInType(linkType)?.let {
105-
linkResolver!!.linkToClass(it)
102+
return jvmClassHelper.resolveClassInType(linkType)?.let {
103+
linkResolver.linkToClass(it)
106104
}
107105
}
108106

109107
override fun linkToField(plainText: String, linkField: PsiField): String? {
110-
return linkResolver!!.linkToProperty(linkField)
108+
return linkResolver.linkToProperty(linkField)
111109
}
112110

113111
override fun linkToMethod(plainText: String, linkMethod: PsiMethod): String? {
114-
return linkResolver!!.linkToMethod(linkMethod)
112+
return linkResolver.linkToMethod(linkMethod)
115113
}
116114

117115
override fun linkToUnresolved(plainText: String): String {
@@ -124,7 +122,6 @@ open class ClassApiExporterHelper {
124122
methodParamComment["$name@options"] = options
125123
}
126124
}
127-
128125
}
129126

130127
return methodParamComment
@@ -137,7 +134,7 @@ open class ClassApiExporterHelper {
137134
cls: PsiClass, handle: (ExplicitMethod) -> Unit,
138135
) {
139136
actionContext.runInReadUI {
140-
val methods = duckTypeHelper!!.explicit(cls)
137+
val methods = duckTypeHelper.explicit(cls)
141138
.methods()
142139
.filter { !shouldIgnore(it) }
143140
actionContext.runAsync {
@@ -158,28 +155,28 @@ open class ClassApiExporterHelper {
158155
}
159156

160157
protected open fun shouldIgnore(explicitElement: ExplicitMethod): Boolean {
161-
if (ignoreIrregularApiMethod() && (jvmClassHelper!!.isBasicMethod(explicitElement.psi().name)
158+
if (ignoreIrregularApiMethod() && (jvmClassHelper.isBasicMethod(explicitElement.psi().name)
162159
|| explicitElement.psi().hasModifierProperty("static")
163160
|| explicitElement.psi().isConstructor)
164161
) {
165162
return true
166163
}
167-
return ruleComputer!!.computer(ClassExportRuleKeys.IGNORE, explicitElement) ?: false
164+
return ruleComputer.computer(ClassExportRuleKeys.IGNORE, explicitElement) ?: false
168165
}
169166

170167
protected open fun shouldIgnore(psiMethod: PsiMethod): Boolean {
171-
if (ignoreIrregularApiMethod() && (jvmClassHelper!!.isBasicMethod(psiMethod.name)
168+
if (ignoreIrregularApiMethod() && (jvmClassHelper.isBasicMethod(psiMethod.name)
172169
|| psiMethod.hasModifierProperty("static")
173170
|| psiMethod.isConstructor)
174171
) {
175172
return true
176173
}
177-
return ruleComputer!!.computer(ClassExportRuleKeys.IGNORE, psiMethod) ?: false
174+
return ruleComputer.computer(ClassExportRuleKeys.IGNORE, psiMethod) ?: false
178175
}
179176

180177
fun foreachPsiMethod(cls: PsiClass, handle: (PsiMethod) -> Unit) {
181178
actionContext.runInReadUI {
182-
jvmClassHelper!!.getAllMethods(cls)
179+
jvmClassHelper.getAllMethods(cls)
183180
.asSequence()
184181
.filter { !shouldIgnore(it) }
185182
.forEach(handle)
@@ -193,7 +190,7 @@ open class ClassApiExporterHelper {
193190
}
194191

195192
fun export(handle: (Doc) -> Unit) {
196-
logger.info("Start export api...")
193+
logger.info("Starting API export process...")
197194
val psiClassQueue: BlockingQueue<PsiClass> = LinkedBlockingQueue()
198195

199196
val boundary = actionContext.createBoundary()
@@ -238,11 +235,11 @@ open class ClassApiExporterHelper {
238235
}
239236
} else {
240237
val classQualifiedName = actionContext.callInReadUI { psiClass.qualifiedName }
241-
LOG.info("wait api parsing... $classQualifiedName")
238+
LOG.info("Processing API for class: $classQualifiedName")
242239
actionContext.withBoundary {
243-
classExporter!!.export(psiClass) { handle(it) }
240+
classExporter.export(psiClass) { handle(it) }
244241
}
245-
LOG.info("api parse $classQualifiedName completed.")
242+
LOG.info("Successfully parsed API for class: $classQualifiedName")
246243
}
247244
}
248245
}

idea-plugin/src/main/kotlin/com/itangcent/idea/plugin/api/export/suv/SuvApiExporter.kt

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ open class SuvApiExporter {
7777
val docs = classApiExporterHelper.export().map { DocWrapper(it) }
7878

7979
if (docs.isEmpty()) {
80-
logger.info("No api be found!")
80+
logger.info("No API found in the selected files")
8181
return
8282
}
8383

@@ -153,11 +153,11 @@ open class SuvApiExporter {
153153

154154
abstract class ApiExporterAdapter {
155155

156-
@Inject(optional = true)
157-
protected var logger: Logger? = null
156+
@Inject
157+
protected lateinit var logger: Logger
158158

159159
@Inject
160-
protected val classExporter: ClassExporter? = null
160+
protected lateinit var classExporter: ClassExporter
161161

162162
@Inject
163163
protected lateinit var actionContext: ActionContext
@@ -202,13 +202,13 @@ open class SuvApiExporter {
202202
try {
203203
doExportApisFromMethod(requests)
204204
} catch (e: Exception) {
205-
logger!!.error("error to export apis:" + e.message)
205+
logger!!.error("Failed to export APIs: " + e.message)
206206
logger!!.traceError(e)
207207
}
208208
}
209209
}
210210
} catch (e: Throwable) {
211-
logger!!.error("error to export apis:" + e.message)
211+
logger!!.error("Failed to export APIs: " + e.message)
212212
logger!!.traceError(e)
213213
}
214214
}
@@ -295,7 +295,7 @@ open class SuvApiExporter {
295295
}
296296

297297
if (docs.isEmpty()) {
298-
logger!!.info("no api has be found")
298+
logger!!.info("No APIs found")
299299
}
300300

301301
doExportDocs(docs)
@@ -341,10 +341,10 @@ open class SuvApiExporter {
341341
private lateinit var postmanSettingsHelper: PostmanSettingsHelper
342342

343343
@Inject
344-
private val fileSaveHelper: FileSaveHelper? = null
344+
private lateinit var fileSaveHelper: FileSaveHelper
345345

346346
@Inject
347-
private val postmanFormatter: PostmanFormatter? = null
347+
private lateinit var postmanFormatter: PostmanFormatter
348348

349349
@Inject
350350
private lateinit var project: Project
@@ -388,7 +388,7 @@ open class SuvApiExporter {
388388
class YapiApiExporterAdapter : ApiExporterAdapter() {
389389

390390
@Inject
391-
protected val yapiSettingsHelper: YapiSettingsHelper? = null
391+
protected lateinit var yapiSettingsHelper: YapiSettingsHelper
392392

393393
override fun actionName(): String {
394394
return "YapiExportAction"
@@ -429,7 +429,7 @@ open class SuvApiExporter {
429429
}
430430

431431
override fun beforeExport(next: () -> Unit) {
432-
val serverFound = yapiSettingsHelper!!.getServer(false).notNullOrBlank()
432+
val serverFound = yapiSettingsHelper.getServer(false).notNullOrBlank()
433433
if (serverFound) {
434434
next()
435435
}
@@ -441,7 +441,7 @@ open class SuvApiExporter {
441441
try {
442442
docs.forEach { suvYapiApiExporter.exportDoc(it) }
443443
} catch (e: Exception) {
444-
logger!!.error("Apis export failed")
444+
logger!!.error("Failed to export APIs to YAPI")
445445
logger!!.traceError(e)
446446
}
447447
}
@@ -490,10 +490,10 @@ open class SuvApiExporter {
490490
class MarkdownApiExporterAdapter : ApiExporterAdapter() {
491491

492492
@Inject
493-
private val fileSaveHelper: FileSaveHelper? = null
493+
private lateinit var fileSaveHelper: FileSaveHelper
494494

495495
@Inject
496-
private val markdownFormatter: MarkdownFormatter? = null
496+
private lateinit var markdownFormatter: MarkdownFormatter
497497

498498
@Inject
499499
private lateinit var markdownSettingsHelper: MarkdownSettingsHelper
@@ -525,15 +525,15 @@ open class SuvApiExporter {
525525
override fun doExportDocs(docs: MutableList<Doc>) {
526526
try {
527527
if (docs.isEmpty()) {
528-
logger!!.info("No api be found to export!")
528+
logger!!.info("No API found in the selected scope")
529529
return
530530
}
531531
logger!!.info("Start parse apis")
532-
val apiInfo = markdownFormatter!!.parseRequests(docs)
532+
val apiInfo = markdownFormatter.parseRequests(docs)
533533
docs.clear()
534534
actionContext.runAsync {
535535
try {
536-
fileSaveHelper!!.saveOrCopy(apiInfo, markdownSettingsHelper.outputCharset(), {
536+
fileSaveHelper.saveOrCopy(apiInfo, markdownSettingsHelper.outputCharset(), {
537537
logger!!.info("Exported data are copied to clipboard,you can paste to a md file now")
538538
}, {
539539
logger!!.info("Apis save success: $it")
@@ -584,7 +584,7 @@ open class SuvApiExporter {
584584
val requests = docs.filterAs(Request::class)
585585
try {
586586
if (docs.isEmpty()) {
587-
logger!!.info("No api be found to export!")
587+
logger!!.info("No API found in the selected scope")
588588
return
589589
}
590590
curlExporter.export(requests)
@@ -626,7 +626,7 @@ open class SuvApiExporter {
626626
val requests = docs.filterAs(Request::class)
627627
try {
628628
if (docs.isEmpty()) {
629-
logger!!.info("No api be found to export!")
629+
logger!!.info("No API found in the selected scope")
630630
return
631631
}
632632
httpClientExporter.export(requests)
@@ -638,7 +638,7 @@ open class SuvApiExporter {
638638

639639
private fun doExport(channel: ApiExporterWrapper, requests: List<DocWrapper>) {
640640
if (requests.isEmpty()) {
641-
logger.info("no api has be selected")
641+
logger.info("No API found in the selected scope")
642642
return
643643
}
644644
val adapter = channel.adapter.createInstance() as ApiExporterAdapter

0 commit comments

Comments
 (0)