package com.example.demo;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.MethodOrderer.OrderAnnotation;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import com.example.demo.core.error.NotFoundException;
import com.example.demo.stocks.model.StockEntity;
import com.example.demo.stocks.service.StockService;

@SpringBootTest
@TestMethodOrder(OrderAnnotation.class)
class StockServiceTests {
    @Autowired
    private StockService stockService;

    @Test
    void getTest() {
        Assertions.assertThrows(NotFoundException.class, () -> stockService.get(0L));
    }

    @Test
    @Order(1)
    void createTest() {
        stockService.create(new StockEntity(null, "Stock 1", 50));
		stockService.create(new StockEntity(null, "Stock 2", 0));
		final StockEntity last = stockService.create(new StockEntity(null, "Stock 3", 25));
		Assertions.assertEquals(3, stockService.getAll().size());
		Assertions.assertEquals(last, stockService.get(3L));
    }

    @Test
    @Order(2)
    void updateTest() {
        final String test = "TEST";
        final Integer valueTest = 15;
		final StockEntity entity = stockService.get(3L);
		final String oldName = entity.getName();
		final StockEntity newEntity = stockService.update(3L, new StockEntity(1L, test, valueTest));
		Assertions.assertEquals(3, stockService.getAll().size());
		Assertions.assertEquals(newEntity, stockService.get(3L));
		Assertions.assertEquals(test, newEntity.getName());
		Assertions.assertNotEquals(oldName, newEntity.getName());
    }

    @Test
    @Order(3)
    void deleteTest() {
        stockService.delete(3L);
		Assertions.assertEquals(2, stockService.getAll().size());
		final StockEntity last = stockService.get(2L);
		Assertions.assertEquals(2L, last.getId());

		final StockEntity newEntity = stockService.create(new StockEntity(null, "TEST", 15));
		Assertions.assertEquals(3, stockService.getAll().size());
		Assertions.assertEquals(4L, newEntity.getId());
    }
}