package com.condado.newsletter.controller import com.condado.newsletter.model.VirtualEntity import com.condado.newsletter.repository.EntityTaskRepository import com.condado.newsletter.repository.GeneratedMessageHistoryRepository import com.condado.newsletter.repository.VirtualEntityRepository import com.condado.newsletter.scheduler.EntityScheduler import com.condado.newsletter.service.JwtService import com.ninjasquad.springmockk.MockkBean import jakarta.servlet.http.Cookie import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.Test import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc import org.springframework.boot.test.context.SpringBootTest import org.springframework.http.MediaType import org.springframework.test.web.servlet.MockMvc import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post import org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath import org.springframework.test.web.servlet.result.MockMvcResultMatchers.status @SpringBootTest @AutoConfigureMockMvc class EntityTaskControllerTest { @Autowired lateinit var mockMvc: MockMvc @Autowired lateinit var jwtService: JwtService @Autowired lateinit var virtualEntityRepository: VirtualEntityRepository @Autowired lateinit var entityTaskRepository: EntityTaskRepository @Autowired lateinit var generatedMessageHistoryRepository: GeneratedMessageHistoryRepository @MockkBean lateinit var entityScheduler: EntityScheduler private fun authCookie() = Cookie("jwt", jwtService.generateToken()) @AfterEach fun cleanUp() { generatedMessageHistoryRepository.deleteAll() entityTaskRepository.deleteAll() virtualEntityRepository.deleteAll() } @Test fun should_createTask_when_promptIsBlankInCreateRequest() { val entity = virtualEntityRepository.save( VirtualEntity( name = "Entity A", email = "entity-a@condado.com", jobTitle = "Ops" ) ) val payload = """ { "entityId": "${entity.id}", "name": "Morning Blast", "prompt": "", "scheduleCron": "0 8 * * 1-5", "emailLookback": "last_week" } """.trimIndent() mockMvc.perform( post("/api/v1/tasks") .cookie(authCookie()) .contentType(MediaType.APPLICATION_JSON) .content(payload) ) .andExpect(status().isCreated) .andExpect(jsonPath("$.entityId").value(entity.id.toString())) .andExpect(jsonPath("$.name").value("Morning Blast")) .andExpect(jsonPath("$.prompt").value("")) } }