package com.alexanderlogistics.ksef.api;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;
import static org.mockito.Mockito.when;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Logger;
import org.imixs.workflow.FileData;
import org.imixs.workflow.ItemCollection;
import org.imixs.workflow.engine.DocumentService;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import com.alexanderlogistics.BusinessPartnerService;
import com.alexanderlogistics.InvoiceService;
import com.alexanderlogistics.TestLoggerConfig;
import com.alexanderlogistics.einvoice.KSeFAdapter;
/**
* Der KSeFAdapterTest prüft die Umwandlung einer Rechnung in die KSeF XML
* Struktur.
*
* Der Test simuliert eine Invoice und ruft dann den KSeFAdapter an um ein
* Output File zu erzeugen.
*
* Zum validieren kann man dann den validate_xml.sh Script hernehmen
*
*/
@ExtendWith(MockitoExtension.class)
public class KSeFAdapterTest {
private static Logger logger = Logger.getLogger(KSeFAdapterTest.class.getName());
private static final String TEMPLATE_FILE = "ksef/ksef.xml";
ItemCollection businessPartner;
@Mock
private BusinessPartnerService businessPartnerService;
@Mock
private DocumentService documentService;
@Mock
private InvoiceService invoiceService;
@InjectMocks
private KSeFAdapter adapter;
@BeforeEach
void setup() throws Exception {
TestLoggerConfig.setupTestLogger();
// Prepare mock business partner
businessPartner = new ItemCollection();
businessPartner.setItemValue("partner.name", "Test Sp. z o.o.");
businessPartner.setItemValue("partner.country", "PL");
businessPartner.setItemValue("partner.city", "Warszawa");
businessPartner.setItemValue("partner.zip", "00-001");
businessPartner.setItemValue("partner.address", "ul. Testowa 1");
businessPartner.setItemValue("partner.vat", "PL1234567890");
businessPartner.setItemValue("dbtr.number", "D-12345");
}
/**
* Erzeugt ein lokales XML File zum testen
*/
@Test
@DisplayName("Test Simple Invoice")
public void testSimpleInvoice() throws Exception {
logger.info("==> Test: Upload Invoice XML");
// Prepare a workitem with typical invoice data
ItemCollection workitem = new ItemCollection();
workitem.setItemValue("invoice.number", "FV/2025/001");
workitem.setItemValue("invoice.date", LocalDate.of(2025, 2, 10));
workitem.setItemValue("invoice.duedate", LocalDate.of(2025, 3, 10));
workitem.setItemValue("invoice.currency", "PLN");
workitem.setItemValue("invoice.total.net", 10000.00);
workitem.setItemValue("invoice.total.tax", 23.0);
workitem.setItemValue("invoice.total", 12300.00);
workitem.setItemValue("invoice.correction", "false");
workitem.setItemValue("invoice.CorrectionInvoiceNumber", "");
workitem.setItemValue("partner.id", "BP-001");
workitem.setItemValue("partner.vat", "PL1234567890");
workitem.setItemValue("invoice.performancedate", new Date());
// Prepare child items (invoice line items)
List