Skip to content

Commit 9b89242

Browse files
committed
Add RBAC tests and implementation for solution file management features
- Implemented new RBAC-based logic for solution file operations: upload, download, list, and delete. - Added integration and RBAC tests for comprehensive solution file management validation. - Introduced new utilities to support S3 file operations within solutions.
1 parent 25996c5 commit 9b89242

File tree

5 files changed

+609
-6
lines changed

5 files changed

+609
-6
lines changed

solution/src/integrationTest/kotlin/com/cosmotech/solution/service/SolutionServiceIntegrationTest.kt

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,14 @@ import io.mockk.every
2828
import io.mockk.junit5.MockKExtension
2929
import io.mockk.mockk
3030
import io.mockk.mockkStatic
31+
import java.io.FileInputStream
3132
import java.time.Instant
3233
import java.util.*
3334
import kotlin.test.assertEquals
3435
import kotlin.test.assertFalse
3536
import kotlin.test.assertNotNull
3637
import kotlin.test.assertTrue
38+
import org.apache.commons.io.IOUtils
3739
import org.junit.jupiter.api.BeforeEach
3840
import org.junit.jupiter.api.DynamicTest
3941
import org.junit.jupiter.api.Test
@@ -44,10 +46,13 @@ import org.junit.runner.RunWith
4446
import org.slf4j.LoggerFactory
4547
import org.springframework.beans.factory.annotation.Autowired
4648
import org.springframework.boot.test.context.SpringBootTest
49+
import org.springframework.core.io.ResourceLoader
50+
import org.springframework.mock.web.MockMultipartFile
4751
import org.springframework.test.context.ActiveProfiles
4852
import org.springframework.test.context.junit.jupiter.SpringExtension
4953
import org.springframework.test.context.junit4.SpringRunner
5054
import org.springframework.test.util.ReflectionTestUtils
55+
import software.amazon.awssdk.services.s3.model.NoSuchKeyException
5156

5257
const val CONNECTED_ADMIN_USER = "[email protected]"
5358
const val CONNECTED_READER_USER = "[email protected]"
@@ -62,10 +67,13 @@ class SolutionServiceIntegrationTest : CsmTestBase() {
6267

6368
private val logger = LoggerFactory.getLogger(SolutionServiceIntegrationTest::class.java)
6469

70+
val fileName = "test_solution_file.txt"
71+
6572
@Autowired lateinit var rediSearchIndexer: RediSearchIndexer
6673
@Autowired lateinit var organizationApiService: OrganizationApiServiceInterface
6774
@Autowired lateinit var solutionApiService: SolutionApiServiceInterface
6875
@Autowired lateinit var csmPlatformProperties: CsmPlatformProperties
76+
@Autowired lateinit var resourceLoader: ResourceLoader
6977

7078
private var containerRegistryService: ContainerRegistryService = mockk(relaxed = true)
7179
private var startTime: Long = 0
@@ -2122,6 +2130,107 @@ class SolutionServiceIntegrationTest : CsmTestBase() {
21222130
assertEquals("One or several solution items have same id : runTemplates", exception.message)
21232131
}
21242132

2133+
@Test
2134+
fun `test createSolutionFile`() {
2135+
2136+
val resourceTestFile = resourceLoader.getResource("classpath:/$fileName").file
2137+
val input = FileInputStream(resourceTestFile)
2138+
val multipartFile =
2139+
MockMultipartFile(
2140+
"file", resourceTestFile.getName(), "text/plain", IOUtils.toByteArray(input))
2141+
every { getCurrentAuthenticatedRoles(any()) } returns listOf("Platform.Admin")
2142+
2143+
logger.info("should create a solution file")
2144+
val savedFile =
2145+
solutionApiService.createSolutionFile(
2146+
organizationSaved.id, solutionSaved.id, multipartFile, true, null)
2147+
2148+
assertEquals(fileName, savedFile.fileName)
2149+
}
2150+
2151+
@Test
2152+
fun `test getSolutionFile`() {
2153+
logger.info("should get a solution file")
2154+
val resourceTestFile = resourceLoader.getResource("classpath:/$fileName").file
2155+
val input = FileInputStream(resourceTestFile)
2156+
val expectedFile = FileInputStream(resourceTestFile)
2157+
val multipartFile =
2158+
MockMultipartFile(
2159+
"file", resourceTestFile.getName(), "text/plain", IOUtils.toByteArray(input))
2160+
2161+
solutionApiService.createSolutionFile(
2162+
organizationSaved.id, solutionSaved.id, multipartFile, true, null)
2163+
2164+
val fetchedFile =
2165+
solutionApiService.getSolutionFile(organizationSaved.id, solutionSaved.id, fileName)
2166+
val expectedText = expectedFile.bufferedReader().use { it.readText() }
2167+
val retrievedText = fetchedFile.inputStream.bufferedReader().use { it.readText() }
2168+
assertEquals(expectedText, retrievedText)
2169+
}
2170+
2171+
@Test
2172+
fun `test listSolutionFiles`() {
2173+
every { getCurrentAuthenticatedRoles(any()) } returns listOf("Platform.Admin")
2174+
2175+
logger.info("should list all solution file")
2176+
val resourceTestFile = resourceLoader.getResource("classpath:/$fileName").file
2177+
val input = FileInputStream(resourceTestFile)
2178+
val multipartFile =
2179+
MockMultipartFile(
2180+
"file", resourceTestFile.getName(), "text/plain", IOUtils.toByteArray(input))
2181+
2182+
var solutionFiles = solutionApiService.listSolutionFiles(organizationSaved.id, solutionSaved.id)
2183+
assertTrue(solutionFiles.isEmpty())
2184+
2185+
solutionApiService.createSolutionFile(
2186+
organizationSaved.id, solutionSaved.id, multipartFile, true, null)
2187+
2188+
solutionFiles = solutionApiService.listSolutionFiles(organizationSaved.id, solutionSaved.id)
2189+
assertEquals(1, solutionFiles.size)
2190+
}
2191+
2192+
@Test
2193+
fun `test deleteSolutionFile`() {
2194+
logger.info("should delete a solution file")
2195+
val resourceTestFile = resourceLoader.getResource("classpath:/$fileName").file
2196+
val input = FileInputStream(resourceTestFile)
2197+
val multipartFile =
2198+
MockMultipartFile(
2199+
"file", resourceTestFile.getName(), "text/plain", IOUtils.toByteArray(input))
2200+
2201+
solutionApiService.createSolutionFile(
2202+
organizationSaved.id, solutionSaved.id, multipartFile, true, null)
2203+
2204+
solutionApiService.deleteSolutionFile(organizationSaved.id, solutionSaved.id, fileName)
2205+
2206+
val exception =
2207+
assertThrows<NoSuchKeyException> {
2208+
solutionApiService.getSolutionFile(organizationSaved.id, solutionSaved.id, fileName)
2209+
}
2210+
2211+
assertEquals("The specified key does not exist.", exception.awsErrorDetails().errorMessage())
2212+
}
2213+
2214+
@Test
2215+
fun `test deleteSolutionFiles`() {
2216+
logger.info("should delete all solution files")
2217+
val resourceTestFile = resourceLoader.getResource("classpath:/$fileName").file
2218+
val input = FileInputStream(resourceTestFile)
2219+
val multipartFile =
2220+
MockMultipartFile(
2221+
"file", resourceTestFile.getName(), "text/plain", IOUtils.toByteArray(input))
2222+
2223+
solutionApiService.createSolutionFile(
2224+
organizationSaved.id, solutionSaved.id, multipartFile, true, null)
2225+
solutionApiService.createSolutionFile(
2226+
organizationSaved.id, solutionSaved.id, multipartFile, true, null)
2227+
2228+
solutionApiService.deleteAllS3SolutionObjects(organizationSaved.id, solutionSaved)
2229+
2230+
assertEquals(
2231+
0, solutionApiService.listSolutionFiles(organizationSaved.id, solutionSaved.id).size)
2232+
}
2233+
21252234
@Test
21262235
fun `assert timestamps are functional for base CRUD`() {
21272236
solutionSaved = solutionApiService.createSolution(organizationSaved.id, makeSolution())

0 commit comments

Comments
 (0)