From 2f3da91745c623d03e24f060519f886230f50af4 Mon Sep 17 00:00:00 2001 From: Jose Chavez Date: Mon, 5 Dec 2022 09:09:56 -0600 Subject: [PATCH 1/6] adding new endpoint with CSVTaskProcessor call --- .../main/kotlin/edu/wgu/osmt/RoutePaths.kt | 4 ++- .../wgu/osmt/collection/CsvTaskProcessor.kt | 24 +++++++++++++ .../wgu/osmt/richskill/RichSkillController.kt | 34 ++++++++++++++++--- .../edu/wgu/osmt/task/TaskMessageService.kt | 1 + .../osmt/richskill/RichSkillControllerTest.kt | 32 +++++++++++++++++ 5 files changed, 90 insertions(+), 5 deletions(-) diff --git a/api/src/main/kotlin/edu/wgu/osmt/RoutePaths.kt b/api/src/main/kotlin/edu/wgu/osmt/RoutePaths.kt index 28e5acadd..240d6f4af 100644 --- a/api/src/main/kotlin/edu/wgu/osmt/RoutePaths.kt +++ b/api/src/main/kotlin/edu/wgu/osmt/RoutePaths.kt @@ -1,8 +1,10 @@ package edu.wgu.osmt object RoutePaths { - const val SEARCH_PATH = "/api/search" + const val API = "/api" + const val SEARCH_PATH = "$API/search" const val SEARCH_SKILLS = "$SEARCH_PATH/skills" + const val EXPORT_LIBRARY = "$API/export/library" const val SEARCH_SIMILAR_SKILLS = "$SEARCH_SKILLS/similarity" const val SEARCH_SIMILARITIES = "$SEARCH_SKILLS/similarities" const val SEARCH_COLLECTIONS = "$SEARCH_PATH/collections" diff --git a/api/src/main/kotlin/edu/wgu/osmt/collection/CsvTaskProcessor.kt b/api/src/main/kotlin/edu/wgu/osmt/collection/CsvTaskProcessor.kt index 4b2af8958..b87ca3fa0 100644 --- a/api/src/main/kotlin/edu/wgu/osmt/collection/CsvTaskProcessor.kt +++ b/api/src/main/kotlin/edu/wgu/osmt/collection/CsvTaskProcessor.kt @@ -5,6 +5,7 @@ import edu.wgu.osmt.config.AppConfig import edu.wgu.osmt.richskill.RichSkillAndCollections import edu.wgu.osmt.richskill.RichSkillCsvExport import edu.wgu.osmt.richskill.RichSkillDescriptorDao +import edu.wgu.osmt.richskill.RichSkillRepository import edu.wgu.osmt.task.CsvTask import edu.wgu.osmt.task.TaskMessageService import edu.wgu.osmt.task.TaskStatus @@ -28,6 +29,9 @@ class CsvTaskProcessor { @Autowired lateinit var collectionRepository: CollectionRepository + @Autowired + lateinit var richSkillRepository: RichSkillRepository + @Autowired lateinit var appConfig: AppConfig @@ -52,4 +56,24 @@ class CsvTaskProcessor { logger.info("Task ${csvTask.uuid} completed") } + @RqueueListener( + value = [TaskMessageService.skillsForFullLibraryCsv], + deadLetterQueueListenerEnabled = "true", + deadLetterQueue = TaskMessageService.deadLetters, + concurrency = "1" + ) + fun csvSkillsInFullLibraryProcessor(csvTask: CsvTask) { + logger.info("Started processing task for Full Library export") + + val csv = richSkillRepository.findAll() + ?.with(RichSkillDescriptorDao::collections) + ?.map { RichSkillAndCollections.fromDao(it) } + ?.let { RichSkillCsvExport(appConfig).toCsv(it) } + + taskMessageService.publishResult( + csvTask.copy(result = csv, status = TaskStatus.Ready) + ) + logger.info("Full Library export task completed") + } + } diff --git a/api/src/main/kotlin/edu/wgu/osmt/richskill/RichSkillController.kt b/api/src/main/kotlin/edu/wgu/osmt/richskill/RichSkillController.kt index 3e17f8371..1f5effead 100644 --- a/api/src/main/kotlin/edu/wgu/osmt/richskill/RichSkillController.kt +++ b/api/src/main/kotlin/edu/wgu/osmt/richskill/RichSkillController.kt @@ -14,15 +14,31 @@ import edu.wgu.osmt.config.AppConfig import edu.wgu.osmt.db.PublishStatus import edu.wgu.osmt.elasticsearch.OffsetPageable import edu.wgu.osmt.keyword.KeywordDao -import edu.wgu.osmt.security.* -import edu.wgu.osmt.task.* +import edu.wgu.osmt.security.OAuthHelper +import edu.wgu.osmt.task.AppliesToType +import edu.wgu.osmt.task.CreateSkillsTask +import edu.wgu.osmt.task.CsvTask +import edu.wgu.osmt.task.PublishTask +import edu.wgu.osmt.task.Task +import edu.wgu.osmt.task.TaskMessageService +import edu.wgu.osmt.task.TaskResult import org.springframework.beans.factory.annotation.Autowired -import org.springframework.http.* +import org.springframework.http.HttpEntity +import org.springframework.http.HttpHeaders +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity import org.springframework.security.core.annotation.AuthenticationPrincipal import org.springframework.security.oauth2.jwt.Jwt import org.springframework.stereotype.Controller import org.springframework.transaction.annotation.Transactional -import org.springframework.web.bind.annotation.* +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PathVariable +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RequestParam +import org.springframework.web.bind.annotation.ResponseBody import org.springframework.web.server.ResponseStatusException import org.springframework.web.util.UriComponentsBuilder @@ -183,4 +199,14 @@ class RichSkillController @Autowired constructor( val sizedIterable = auditLogRepository.findByTableAndId(RichSkillDescriptorTable.tableName, entityId = skill!!.id.value, offsetPageable = pageable) return ResponseEntity.status(200).body(sizedIterable.toList().map{it.toModel()}) } + + @GetMapping(RoutePaths.EXPORT_LIBRARY, produces = [MediaType.APPLICATION_JSON_VALUE]) + fun getSkillsForLibraryCsv( + ): HttpEntity { + val task = CsvTask(collectionUuid = "FullLibrary") + taskMessageService.enqueueJob(TaskMessageService.skillsForFullLibraryCsv, task) + val processingResponse = Task.processingResponse(task) + return processingResponse + + } } diff --git a/api/src/main/kotlin/edu/wgu/osmt/task/TaskMessageService.kt b/api/src/main/kotlin/edu/wgu/osmt/task/TaskMessageService.kt index 5a4f9fc34..0dd63dc48 100644 --- a/api/src/main/kotlin/edu/wgu/osmt/task/TaskMessageService.kt +++ b/api/src/main/kotlin/edu/wgu/osmt/task/TaskMessageService.kt @@ -43,5 +43,6 @@ class TaskMessageService { const val publishSkills = "batch-publish-skills" const val updateCollectionSkills = "update-collection-skills" const val skillsForCollectionCsv = "collection-skills-csv-process" + const val skillsForFullLibraryCsv = "full-library-skills-csv-process" } } diff --git a/api/src/test/kotlin/edu/wgu/osmt/richskill/RichSkillControllerTest.kt b/api/src/test/kotlin/edu/wgu/osmt/richskill/RichSkillControllerTest.kt index 675374e5f..9438fd349 100644 --- a/api/src/test/kotlin/edu/wgu/osmt/richskill/RichSkillControllerTest.kt +++ b/api/src/test/kotlin/edu/wgu/osmt/richskill/RichSkillControllerTest.kt @@ -6,15 +6,22 @@ import edu.wgu.osmt.HasElasticsearchReset import edu.wgu.osmt.SpringTest import edu.wgu.osmt.api.model.ApiSearch import edu.wgu.osmt.collection.CollectionEsRepo +import edu.wgu.osmt.collection.CsvTaskProcessor import edu.wgu.osmt.csv.BatchImportRichSkill import edu.wgu.osmt.csv.RichSkillRow import edu.wgu.osmt.jobcode.JobCodeEsRepo import edu.wgu.osmt.keyword.KeywordEsRepo import edu.wgu.osmt.mockdata.MockData +import edu.wgu.osmt.task.CsvTask +import edu.wgu.osmt.task.TaskMessageService import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.BeforeAll +import org.junit.jupiter.api.Disabled import org.junit.jupiter.api.Test +import org.mockito.Mockito import org.springframework.beans.factory.annotation.Autowired +import org.springframework.http.HttpHeaders +import org.springframework.http.MediaType import org.springframework.security.oauth2.jwt.Jwt import org.springframework.transaction.annotation.Transactional import org.springframework.web.util.UriComponentsBuilder @@ -33,12 +40,22 @@ internal class RichSkillControllerTest @Autowired constructor( @Autowired lateinit var batchImportRichSkill: BatchImportRichSkill + @Autowired + lateinit var tms: TaskMessageService + + lateinit var csvtp: CsvTaskProcessor + private lateinit var mockData : MockData val nullJwt : Jwt? = null + companion object { + const val skillsForFullLibraryCsv = "full-library-skills-csv-process" + } + @BeforeAll fun setup() { mockData = MockData() + csvtp = CsvTaskProcessor() } @Test @@ -149,4 +166,19 @@ internal class RichSkillControllerTest @Autowired constructor( assertThat(result.body?.get(0)?.operationType).isEqualTo("Insert") assertThat(result.body?.get(0)?.user).isEqualTo("Batch Import") } + + @Disabled + @Test + fun testExportLibrary() { + + val responseHeaders = HttpHeaders() + responseHeaders.add("Content-Type", MediaType.APPLICATION_JSON_VALUE) + val task = CsvTask(collectionUuid = "FullLibrary") + + Mockito.`when`(tms.enqueueJob(Mockito.anyString(), task)).thenReturn(Unit) + + val result = richSkillController.getSkillsForLibraryCsv() + assertThat(result.body?.uuid).isNotBlank() + } + } \ No newline at end of file From 011d9adcc146b9db71d7a3a2e84997b7b70fd091 Mon Sep 17 00:00:00 2001 From: Jose Chavez Date: Mon, 5 Dec 2022 13:56:03 -0600 Subject: [PATCH 2/6] adding User validation --- .../edu/wgu/osmt/richskill/RichSkillController.kt | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/api/src/main/kotlin/edu/wgu/osmt/richskill/RichSkillController.kt b/api/src/main/kotlin/edu/wgu/osmt/richskill/RichSkillController.kt index 1f5effead..6cc7a4eef 100644 --- a/api/src/main/kotlin/edu/wgu/osmt/richskill/RichSkillController.kt +++ b/api/src/main/kotlin/edu/wgu/osmt/richskill/RichSkillController.kt @@ -41,6 +41,7 @@ import org.springframework.web.bind.annotation.RequestParam import org.springframework.web.bind.annotation.ResponseBody import org.springframework.web.server.ResponseStatusException import org.springframework.web.util.UriComponentsBuilder +import java.util.* @Controller @Transactional @@ -190,11 +191,17 @@ class RichSkillController @Autowired constructor( @GetMapping(RoutePaths.SKILL_AUDIT_LOG, produces = ["application/json"]) fun skillAuditLog( - @PathVariable uuid: String + @AuthenticationPrincipal user: Jwt? ): HttpEntity> { + if (!appConfig.allowPublicSearching && user === null) { + throw GeneralApiException("Unauthorized", HttpStatus.UNAUTHORIZED) + } + if (!oAuthHelper.hasRole(appConfig.roleAdmin)) { + throw GeneralApiException("OSMT user must have an Admin role.", HttpStatus.UNAUTHORIZED) + } val pageable = OffsetPageable(0, Int.MAX_VALUE, AuditLogSortEnum.forValueOrDefault(AuditLogSortEnum.DateDesc.apiValue).sort) - val skill = richSkillRepository.findByUUID(uuid) + val skill = richSkillRepository.findByUUID(UUID.randomUUID().toString()) val sizedIterable = auditLogRepository.findByTableAndId(RichSkillDescriptorTable.tableName, entityId = skill!!.id.value, offsetPageable = pageable) return ResponseEntity.status(200).body(sizedIterable.toList().map{it.toModel()}) From 0da4b6f2e82066da469584494a0cbec996e27f56 Mon Sep 17 00:00:00 2001 From: Jose Chavez Date: Mon, 5 Dec 2022 15:39:06 -0600 Subject: [PATCH 3/6] Reverting changes on wrong endpoint --- .../wgu/osmt/richskill/RichSkillController.kt | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/api/src/main/kotlin/edu/wgu/osmt/richskill/RichSkillController.kt b/api/src/main/kotlin/edu/wgu/osmt/richskill/RichSkillController.kt index 6cc7a4eef..86337f2aa 100644 --- a/api/src/main/kotlin/edu/wgu/osmt/richskill/RichSkillController.kt +++ b/api/src/main/kotlin/edu/wgu/osmt/richskill/RichSkillController.kt @@ -41,7 +41,6 @@ import org.springframework.web.bind.annotation.RequestParam import org.springframework.web.bind.annotation.ResponseBody import org.springframework.web.server.ResponseStatusException import org.springframework.web.util.UriComponentsBuilder -import java.util.* @Controller @Transactional @@ -191,29 +190,34 @@ class RichSkillController @Autowired constructor( @GetMapping(RoutePaths.SKILL_AUDIT_LOG, produces = ["application/json"]) fun skillAuditLog( - @AuthenticationPrincipal user: Jwt? + @PathVariable uuid: String ): HttpEntity> { - if (!appConfig.allowPublicSearching && user === null) { - throw GeneralApiException("Unauthorized", HttpStatus.UNAUTHORIZED) - } - if (!oAuthHelper.hasRole(appConfig.roleAdmin)) { - throw GeneralApiException("OSMT user must have an Admin role.", HttpStatus.UNAUTHORIZED) - } + val pageable = OffsetPageable(0, Int.MAX_VALUE, AuditLogSortEnum.forValueOrDefault(AuditLogSortEnum.DateDesc.apiValue).sort) - val skill = richSkillRepository.findByUUID(UUID.randomUUID().toString()) + val skill = richSkillRepository.findByUUID(uuid) val sizedIterable = auditLogRepository.findByTableAndId(RichSkillDescriptorTable.tableName, entityId = skill!!.id.value, offsetPageable = pageable) return ResponseEntity.status(200).body(sizedIterable.toList().map{it.toModel()}) } + @Transactional(readOnly = true) @GetMapping(RoutePaths.EXPORT_LIBRARY, produces = [MediaType.APPLICATION_JSON_VALUE]) - fun getSkillsForLibraryCsv( + @ResponseBody + fun exportLibrary( + uriComponentsBuilder: UriComponentsBuilder, + @AuthenticationPrincipal user: Jwt? ): HttpEntity { + if (!appConfig.allowPublicSearching && user === null) { + throw GeneralApiException("Unauthorized", HttpStatus.UNAUTHORIZED) + } + if (!oAuthHelper.hasRole(appConfig.roleAdmin)) { + throw GeneralApiException("OSMT user must have an Admin role.", HttpStatus.UNAUTHORIZED) + } + val task = CsvTask(collectionUuid = "FullLibrary") taskMessageService.enqueueJob(TaskMessageService.skillsForFullLibraryCsv, task) - val processingResponse = Task.processingResponse(task) - return processingResponse + return Task.processingResponse(task) } } From 9cdd00af827da17d66751d6fff1233cd12000fba Mon Sep 17 00:00:00 2001 From: Jose Chavez Date: Mon, 5 Dec 2022 15:59:44 -0600 Subject: [PATCH 4/6] removing extra parameter --- .../main/kotlin/edu/wgu/osmt/richskill/RichSkillController.kt | 1 - .../kotlin/edu/wgu/osmt/richskill/RichSkillControllerTest.kt | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/api/src/main/kotlin/edu/wgu/osmt/richskill/RichSkillController.kt b/api/src/main/kotlin/edu/wgu/osmt/richskill/RichSkillController.kt index 86337f2aa..5924fb362 100644 --- a/api/src/main/kotlin/edu/wgu/osmt/richskill/RichSkillController.kt +++ b/api/src/main/kotlin/edu/wgu/osmt/richskill/RichSkillController.kt @@ -205,7 +205,6 @@ class RichSkillController @Autowired constructor( @GetMapping(RoutePaths.EXPORT_LIBRARY, produces = [MediaType.APPLICATION_JSON_VALUE]) @ResponseBody fun exportLibrary( - uriComponentsBuilder: UriComponentsBuilder, @AuthenticationPrincipal user: Jwt? ): HttpEntity { if (!appConfig.allowPublicSearching && user === null) { diff --git a/api/src/test/kotlin/edu/wgu/osmt/richskill/RichSkillControllerTest.kt b/api/src/test/kotlin/edu/wgu/osmt/richskill/RichSkillControllerTest.kt index 9438fd349..9d082cfc9 100644 --- a/api/src/test/kotlin/edu/wgu/osmt/richskill/RichSkillControllerTest.kt +++ b/api/src/test/kotlin/edu/wgu/osmt/richskill/RichSkillControllerTest.kt @@ -177,7 +177,7 @@ internal class RichSkillControllerTest @Autowired constructor( Mockito.`when`(tms.enqueueJob(Mockito.anyString(), task)).thenReturn(Unit) - val result = richSkillController.getSkillsForLibraryCsv() + val result = richSkillController.exportLibrary(user = nullJwt) assertThat(result.body?.uuid).isNotBlank() } From 277e3b598633dae2a2d7882b026195b9ad3dec79 Mon Sep 17 00:00:00 2001 From: Jose Chavez Date: Tue, 6 Dec 2022 15:31:32 -0600 Subject: [PATCH 5/6] Adding Mockk to use it instead of Mockito --- api/pom.xml | 6 ++ .../osmt/richskill/RichSkillControllerTest.kt | 79 +++++++++++++++---- 2 files changed, 70 insertions(+), 15 deletions(-) diff --git a/api/pom.xml b/api/pom.xml index 5a40bddc7..7a1b30deb 100644 --- a/api/pom.xml +++ b/api/pom.xml @@ -301,6 +301,12 @@ 1.12.4 test + + io.mockk + mockk + 1.9.3 + test + diff --git a/api/src/test/kotlin/edu/wgu/osmt/richskill/RichSkillControllerTest.kt b/api/src/test/kotlin/edu/wgu/osmt/richskill/RichSkillControllerTest.kt index 9d082cfc9..8208adf93 100644 --- a/api/src/test/kotlin/edu/wgu/osmt/richskill/RichSkillControllerTest.kt +++ b/api/src/test/kotlin/edu/wgu/osmt/richskill/RichSkillControllerTest.kt @@ -3,59 +3,73 @@ package edu.wgu.osmt.richskill import edu.wgu.osmt.BaseDockerizedTest import edu.wgu.osmt.HasDatabaseReset import edu.wgu.osmt.HasElasticsearchReset +import edu.wgu.osmt.RoutePaths.EXPORT_LIBRARY import edu.wgu.osmt.SpringTest import edu.wgu.osmt.api.model.ApiSearch import edu.wgu.osmt.collection.CollectionEsRepo -import edu.wgu.osmt.collection.CsvTaskProcessor +import edu.wgu.osmt.config.AppConfig import edu.wgu.osmt.csv.BatchImportRichSkill import edu.wgu.osmt.csv.RichSkillRow import edu.wgu.osmt.jobcode.JobCodeEsRepo import edu.wgu.osmt.keyword.KeywordEsRepo import edu.wgu.osmt.mockdata.MockData +import edu.wgu.osmt.security.OAuthHelper import edu.wgu.osmt.task.CsvTask +import edu.wgu.osmt.task.Task import edu.wgu.osmt.task.TaskMessageService +import edu.wgu.osmt.task.TaskResult +import edu.wgu.osmt.task.TaskStatus +import io.mockk.every +import io.mockk.mockk import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.BeforeAll import org.junit.jupiter.api.Disabled import org.junit.jupiter.api.Test import org.mockito.Mockito import org.springframework.beans.factory.annotation.Autowired +import org.springframework.http.HttpEntity import org.springframework.http.HttpHeaders import org.springframework.http.MediaType +import org.springframework.security.core.Authentication +import org.springframework.security.core.GrantedAuthority +import org.springframework.security.core.context.SecurityContext +import org.springframework.security.core.context.SecurityContextHolder +import org.springframework.security.oauth2.core.user.OAuth2UserAuthority import org.springframework.security.oauth2.jwt.Jwt +import org.springframework.test.util.ReflectionTestUtils import org.springframework.transaction.annotation.Transactional import org.springframework.web.util.UriComponentsBuilder +import java.time.Instant +import java.util.* + @Transactional internal class RichSkillControllerTest @Autowired constructor( override val richSkillEsRepo: RichSkillEsRepo, + val taskMessageService: TaskMessageService, + val oAuthHelper: OAuthHelper, + val appConfig: AppConfig, override val collectionEsRepo: CollectionEsRepo, override val keywordEsRepo: KeywordEsRepo, override val jobCodeEsRepo: JobCodeEsRepo ): SpringTest(), BaseDockerizedTest, HasDatabaseReset, HasElasticsearchReset { + var authentication: Authentication = Mockito.mock(Authentication::class.java) + @Autowired lateinit var richSkillController: RichSkillController @Autowired lateinit var batchImportRichSkill: BatchImportRichSkill - @Autowired - lateinit var tms: TaskMessageService - - lateinit var csvtp: CsvTaskProcessor - private lateinit var mockData : MockData val nullJwt : Jwt? = null - companion object { - const val skillsForFullLibraryCsv = "full-library-skills-csv-process" - } @BeforeAll fun setup() { mockData = MockData() - csvtp = CsvTaskProcessor() + ReflectionTestUtils.setField(appConfig, "roleAdmin", "ROLE_Osmt_Admin"); } @Test @@ -167,18 +181,53 @@ internal class RichSkillControllerTest @Autowired constructor( assertThat(result.body?.get(0)?.user).isEqualTo("Batch Import") } + @Disabled @Test fun testExportLibrary() { - val responseHeaders = HttpHeaders() - responseHeaders.add("Content-Type", MediaType.APPLICATION_JSON_VALUE) - val task = CsvTask(collectionUuid = "FullLibrary") + val securityContext: SecurityContext = Mockito.mock(SecurityContext::class.java) + SecurityContextHolder.setContext(securityContext) - Mockito.`when`(tms.enqueueJob(Mockito.anyString(), task)).thenReturn(Unit) + val attributes: MutableMap = HashMap() + attributes["id"] = "joeg" + attributes["first-name"] = "Joe" + attributes["last-name"] = "Grandja" + attributes["email"] = "joeg@springsecurity.io" - val result = richSkillController.exportLibrary(user = nullJwt) + val authority: GrantedAuthority = OAuth2UserAuthority("ROLE_Osmt_Admin", attributes) + val authorities: MutableSet = HashSet() + authorities.add(authority) + + + Mockito.`when`(securityContext.authentication).thenReturn(authentication) + Mockito.`when`(SecurityContextHolder.getContext().authentication.authorities).thenReturn(authorities) + + + val responseHeaders = HttpHeaders() + responseHeaders.add("Content-Type", MediaType.APPLICATION_JSON_VALUE) + val headers : MutableMap = HashMap() + headers["key"] = "value" + val notNullJwt : Jwt? = Jwt("tokenValue", Instant.MIN, Instant.MAX,headers,headers) +// val task = CsvTask(collectionUuid = "FullLibrary") + val csvTaskResult = TaskResult(UUID.randomUUID().toString(),MediaType.APPLICATION_JSON_VALUE,TaskStatus.Processing, EXPORT_LIBRARY) + +// Mockito.doNothing().`when`(taskMessageService.enqueueJob(TaskMessageService.skillsForFullLibraryCsv, any())) +// Mockito.`when`(Task.processingResponse(any())).thenReturn(HttpEntity(csvTaskResult)) + + val service = mockk() + val task = mockk() + val uuid = UUID.randomUUID() + every { task.uuid } returns uuid.toString() + every { TaskResult.fromTask(any()) } returns csvTaskResult + every { service.enqueueJob(any(), any()) } returns Unit + every { Task.processingResponse(any()) } returns HttpEntity(csvTaskResult) + + val result = richSkillController.exportLibrary(user = notNullJwt) assertThat(result.body?.uuid).isNotBlank() } +// private fun any(): T = Mockito.any() + + } \ No newline at end of file From ae29381a71dd7d42d91af74fa82097727820dd38 Mon Sep 17 00:00:00 2001 From: Jose Chavez Date: Wed, 7 Dec 2022 10:07:18 -0600 Subject: [PATCH 6/6] mocking companion --- api/pom.xml | 8 +------- .../osmt/richskill/RichSkillControllerTest.kt | 18 ++++-------------- 2 files changed, 5 insertions(+), 21 deletions(-) diff --git a/api/pom.xml b/api/pom.xml index 7a1b30deb..ddd3ad093 100644 --- a/api/pom.xml +++ b/api/pom.xml @@ -298,13 +298,7 @@ io.mockk mockk - 1.12.4 - test - - - io.mockk - mockk - 1.9.3 + 1.11.0 test diff --git a/api/src/test/kotlin/edu/wgu/osmt/richskill/RichSkillControllerTest.kt b/api/src/test/kotlin/edu/wgu/osmt/richskill/RichSkillControllerTest.kt index 8208adf93..a4e2f12f7 100644 --- a/api/src/test/kotlin/edu/wgu/osmt/richskill/RichSkillControllerTest.kt +++ b/api/src/test/kotlin/edu/wgu/osmt/richskill/RichSkillControllerTest.kt @@ -21,6 +21,7 @@ import edu.wgu.osmt.task.TaskResult import edu.wgu.osmt.task.TaskStatus import io.mockk.every import io.mockk.mockk +import io.mockk.mockkStatic import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.BeforeAll import org.junit.jupiter.api.Disabled @@ -190,16 +191,11 @@ internal class RichSkillControllerTest @Autowired constructor( SecurityContextHolder.setContext(securityContext) val attributes: MutableMap = HashMap() - attributes["id"] = "joeg" - attributes["first-name"] = "Joe" - attributes["last-name"] = "Grandja" - attributes["email"] = "joeg@springsecurity.io" + attributes["email"] = "j.chavez@wgu.edu" val authority: GrantedAuthority = OAuth2UserAuthority("ROLE_Osmt_Admin", attributes) val authorities: MutableSet = HashSet() authorities.add(authority) - - Mockito.`when`(securityContext.authentication).thenReturn(authentication) Mockito.`when`(SecurityContextHolder.getContext().authentication.authorities).thenReturn(authorities) @@ -209,25 +205,19 @@ internal class RichSkillControllerTest @Autowired constructor( val headers : MutableMap = HashMap() headers["key"] = "value" val notNullJwt : Jwt? = Jwt("tokenValue", Instant.MIN, Instant.MAX,headers,headers) -// val task = CsvTask(collectionUuid = "FullLibrary") val csvTaskResult = TaskResult(UUID.randomUUID().toString(),MediaType.APPLICATION_JSON_VALUE,TaskStatus.Processing, EXPORT_LIBRARY) -// Mockito.doNothing().`when`(taskMessageService.enqueueJob(TaskMessageService.skillsForFullLibraryCsv, any())) -// Mockito.`when`(Task.processingResponse(any())).thenReturn(HttpEntity(csvTaskResult)) val service = mockk() - val task = mockk() - val uuid = UUID.randomUUID() - every { task.uuid } returns uuid.toString() - every { TaskResult.fromTask(any()) } returns csvTaskResult every { service.enqueueJob(any(), any()) } returns Unit + mockkStatic(CsvTask::class) + mockkStatic(TaskResult::class) every { Task.processingResponse(any()) } returns HttpEntity(csvTaskResult) val result = richSkillController.exportLibrary(user = notNullJwt) assertThat(result.body?.uuid).isNotBlank() } -// private fun any(): T = Mockito.any() } \ No newline at end of file