Загрузка данных


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)
}