package roomescape.common.log import ch.qos.logback.classic.spi.ILoggingEvent import io.kotest.assertions.assertSoftly import io.kotest.core.spec.style.FunSpec import io.kotest.matchers.equals.shouldBeEqual import io.kotest.matchers.string.shouldContain import io.mockk.every import io.mockk.mockk class RoomescapeLogMaskingConverterTest : FunSpec({ val converter = RoomescapeLogMaskingConverter() val event: ILoggingEvent = mockk() context("평문 로그에서는 key=value 형식을 처리한다.") { test("2글자 초과이면 맨 앞, 맨 뒤를 제외한 나머지를 가린다.") { val email = "a@a.a" val password = "password12" val accessToken = "accessToken12" every { event.formattedMessage } returns "email=${email}, password=${password}, accessToken = $accessToken" assertSoftly(converter.convert(event)) { this shouldContain "email=${email}" this shouldContain "password=${password.first()}****${password.last()}" this shouldContain "accessToken = ${accessToken.first()}****${accessToken.last()}" } } test("2글자 이하이면 전부 가린다.") { val email = "a@a.a" val password = "pa" val accessToken = "a" every { event.formattedMessage } returns "email=${email}, password=${password}, accessToken = ${accessToken}" assertSoftly(converter.convert(event)) { this shouldContain "email=${email}" this shouldContain "password=****" this shouldContain "accessToken = ****" } } } context("JSON 형식 로그를 처리한다.") { val json = "{\"request_body\":{\"email\":\"a@a.a\",\"password\":\"password12\"}}" test("2글자 초과이면 맨 앞, 맨 뒤를 제외한 나머지를 가린다.") { val password = "password12" val json = "{\"request_body\":{\"email\":\"a@a.a\",\"password\":\"${password}\"}}" every { event.formattedMessage } returns json converter.convert(event) shouldBeEqual "{\"request_body\":{\"email\":\"a@a.a\",\"password\":\"${password.first()}****${password.last()}\"}}" } test("2글자 이하이면 전부 가린다.") { val password = "pa" val json = "{\"request_body\":{\"email\":\"a@a.a\",\"password\":\"${password}\"}}" every { event.formattedMessage } returns json converter.convert(event) shouldBeEqual "{\"request_body\":{\"email\":\"a@a.a\",\"password\":\"****\"}}" } } })