@@ -1355,6 +1355,52 @@ class RemoteCredentialsHandlerTest {
13551355 assertThat(actualValue).isEqualTo(shouldBeReturned.username)
13561356 }
13571357
1358+ @Test
1359+ fun generateUser_whenParsingGenerationParameters_preservesAllFields () {
1360+ val type = " user"
1361+ val uuid = UUID .randomUUID().toString()
1362+ val userCredential = UserCredentialValue (" test-user" , " test-password" , " salt" )
1363+
1364+ // Create generation parameters with ALL fields set
1365+ val originalGenerationParameters = StringGenerationParameters ()
1366+ originalGenerationParameters.length = 15
1367+ originalGenerationParameters.username = " test-username"
1368+ originalGenerationParameters.excludeLower = false
1369+ originalGenerationParameters.excludeUpper = true
1370+ originalGenerationParameters.excludeNumber = true
1371+ originalGenerationParameters.includeSpecial = false
1372+
1373+ // Serialize to ByteString (as remote backend would)
1374+ val generationParamsByteString = subject.createByteStringFromGenerationParameters(type, originalGenerationParameters)
1375+
1376+ // Create a GetResponse with these generation parameters (simulating remote backend response)
1377+ val getResponse =
1378+ GetResponse
1379+ .newBuilder()
1380+ .setName(CREDENTIAL_NAME )
1381+ .setType(type)
1382+ .setData(subject.createByteStringFromData(type, userCredential))
1383+ .setId(uuid)
1384+ .setVersionCreatedAt(versionCreatedAt)
1385+ .setGenerationParameters(generationParamsByteString)
1386+ .build()
1387+
1388+ `when `(client.getByNameRequest(CREDENTIAL_NAME , USER )).thenReturn(getResponse)
1389+
1390+ // Create a new request with matching parameters
1391+ val userGenerateRequest = UserGenerateRequest ()
1392+ userGenerateRequest.setGenerationParameters(originalGenerationParameters)
1393+ userGenerateRequest.name = CREDENTIAL_NAME
1394+ userGenerateRequest.type = type
1395+
1396+ // This should NOT regenerate because parameters match
1397+ val generateResponse = subject.generateCredential(userGenerateRequest)
1398+
1399+ // Verify the credential was not regenerated (existing one returned)
1400+ assertThat(generateResponse.getUuid()).isEqualTo(uuid)
1401+ assertThat((generateResponse.value as UserCredentialValue ).username).isEqualTo(" test-user" )
1402+ }
1403+
13581404 @Test
13591405 fun generatePassword_whenExistingPasswordGenerationParametersDontMatch_generateNewCredential () {
13601406 val type = " password"
@@ -1530,6 +1576,52 @@ class RemoteCredentialsHandlerTest {
15301576 assertThat(actualValue).isEqualTo(originalPassword.stringCredential.toString())
15311577 }
15321578
1579+ @Test
1580+ fun generatePassword_whenParsingGenerationParameters_preservesAllFields () {
1581+ val type = " password"
1582+ val uuid = UUID .randomUUID().toString()
1583+ val password = StringCredentialValue (" test-password" )
1584+
1585+ // Create generation parameters with ALL fields set
1586+ val originalGenerationParameters = StringGenerationParameters ()
1587+ originalGenerationParameters.length = 20
1588+ originalGenerationParameters.username = " test-user"
1589+ originalGenerationParameters.excludeLower = false
1590+ originalGenerationParameters.excludeUpper = true
1591+ originalGenerationParameters.excludeNumber = true
1592+ originalGenerationParameters.includeSpecial = true
1593+
1594+ // Serialize to ByteString (as remote backend would)
1595+ val generationParamsByteString = subject.createByteStringFromGenerationParameters(type, originalGenerationParameters)
1596+
1597+ // Create a GetResponse with these generation parameters (simulating remote backend response)
1598+ val getResponse =
1599+ GetResponse
1600+ .newBuilder()
1601+ .setName(CREDENTIAL_NAME )
1602+ .setType(type)
1603+ .setData(subject.createByteStringFromData(type, password))
1604+ .setId(uuid)
1605+ .setVersionCreatedAt(versionCreatedAt)
1606+ .setGenerationParameters(generationParamsByteString)
1607+ .build()
1608+
1609+ `when `(client.getByNameRequest(CREDENTIAL_NAME , USER )).thenReturn(getResponse)
1610+
1611+ // Create a new request with matching parameters
1612+ val passwordGenerateRequest = PasswordGenerateRequest ()
1613+ passwordGenerateRequest.generationParameters = originalGenerationParameters
1614+ passwordGenerateRequest.name = CREDENTIAL_NAME
1615+ passwordGenerateRequest.type = type
1616+
1617+ // This should NOT regenerate because parameters match
1618+ val generateResponse = subject.generateCredential(passwordGenerateRequest)
1619+
1620+ // Verify the credential was not regenerated (existing one returned)
1621+ assertThat(generateResponse.getUuid()).isEqualTo(uuid)
1622+ assertThat((generateResponse.value as StringCredentialValue ).stringCredential).isEqualTo(" test-password" )
1623+ }
1624+
15331625 @Test
15341626 fun getCredentialByName_whenCredentialDoesNotExist_throwsCorrectError () {
15351627 val exception = StatusRuntimeException (Status .NOT_FOUND )
0 commit comments