package ru.notesapp.util
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Test
import ru.notesapp.domain.SimpleNote
import ru.notesapp.domain.User
class MiniJsonTest {
@Test
fun test_toJson_user_with_email() {
val user = User(1L, "Alice", "alice@example.com", 30)
val json = user.toJson()
assertTrue(json.contains("\"user_id\":1"))
assertTrue(json.contains("\"user_name\":\"Alice\""))
assertTrue(json.contains("\"email\":\"alice@example.com\""))
assertTrue(json.contains("\"age\":30"))
assertTrue(json.startsWith("{"))
assertTrue(json.endsWith("}"))
}
@Test
fun test_toJson_user_with_null_email() {
val user = User(1L, "Bob", null, 25)
val json = user.toJson()
assertTrue(json.contains("\"email\":null"))
assertFalse(json.contains("\"null\""))
}
@Test
fun test_fromJson_user() {
val json = """{"user_id":1,"user_name":"Alice","email":"alice@example.com","age":30}"""
val user = fromJson(json, User::class)
assertEquals(1L, user.id)
assertEquals("Alice", user.name)
assertEquals("alice@example.com", user.email)
assertEquals(30, user.age)
}
@Test
fun test_name_override() {
val user = User(1L, "Alice", null, 30)
val json = user.toJson()
assertTrue(json.contains("user_id"))
assertTrue(json.contains("user_name"))
assertFalse(json.contains("\"id\""))
assertFalse(json.contains("\"name\""))
}
@Test(expected = IllegalArgumentException::class)
fun test_class_without_annotation_throws() {
val obj = NotAnnotated("x")
obj.toJson()
}
@Test
fun test_round_trip() {
val user = User(42L, "Charlie", "charlie@test.com", 45)
val json = user.toJson()
val restored = fromJson(json, User::class)
assertEquals(user, restored)
}
@Test
fun test_round_trip_simple_note() {
val note = SimpleNote(
id = 7L,
title = "Заголовок",
content = "Содержание",
createdAt = 1234567890L,
imageUrl = null,
)
val json = note.toJson()
val restored = fromJson(json, SimpleNote::class)
assertEquals(note, restored)
}
// Вспомогательный класс без аннотации
private data class NotAnnotated(val value: String)
}