import MoltenMessageBlock from "$/component/message/MoltenMessageBlock";
import { render, screen } from "@testing-library/react";
import { describe, expect, it } from "vitest";


const messageText = "This is a molten message block component used for displaying important messages to users.";


describe("Renders with defaults", () => {
	it("Renders with default properties", () => {
		render(<MoltenMessageBlock>{messageText}</MoltenMessageBlock>);

		//Make sure the message div is present
		const messageBlock = screen.getByTestId("mattrixwv-molten-message-block");
		expect(messageBlock).toBeInTheDocument();
		expect(messageBlock).toHaveTextContent(messageText);
		//Check for the default classes
		expect(messageBlock).toHaveClass("px-4", "py-2");
		expect(messageBlock).toHaveClass("border");
		expect(messageBlock).toHaveClass("rounded-lg");
		expect(messageBlock).toHaveClass("bg-orange-100", "text-orange-600");
	});
	it("Renders with custom className", () => {
		const customClassName = "custom-molten-message-block-class";

		render(<MoltenMessageBlock className={customClassName}>{messageText}</MoltenMessageBlock>);

		//Make sure the message div is present
		const messageBlock = screen.getByTestId("mattrixwv-molten-message-block");
		expect(messageBlock).toBeInTheDocument();
		expect(messageBlock).toHaveTextContent(messageText);
		//Check for the custom class
		expect(messageBlock).toHaveClass(customClassName);
	});
	it("Renders with aria-label", () => {
		const ariaLabel = "Molten Message Block Aria Label";

		render(<MoltenMessageBlock aria-label={ariaLabel}>{messageText}</MoltenMessageBlock>);

		//Make sure the message div is present
		const messageBlock = screen.getByTestId("mattrixwv-molten-message-block");
		expect(messageBlock).toBeInTheDocument();
		expect(messageBlock).toHaveTextContent(messageText);
		//Check for the aria-label attribute
		expect(messageBlock).toHaveAttribute("aria-label", ariaLabel);
	});
});

describe("Outline Variants", () => {
	it("Renders with no outline", () => {
		render(<MoltenMessageBlock outline="none">{messageText}</MoltenMessageBlock>);

		//Make sure the message div is present
		const messageBlock = screen.getByTestId("mattrixwv-molten-message-block");
		expect(messageBlock).toBeInTheDocument();
		expect(messageBlock).toHaveTextContent(messageText);
		//Check for the no outline class
		expect(messageBlock).toHaveClass("border-0");
	});
	it("Renders with small outline", () => {
		render(<MoltenMessageBlock outline="sm">{messageText}</MoltenMessageBlock>);

		//Make sure the message div is present
		const messageBlock = screen.getByTestId("mattrixwv-molten-message-block");
		expect(messageBlock).toBeInTheDocument();
		expect(messageBlock).toHaveTextContent(messageText);
		//Check for the small outline class
		expect(messageBlock).toHaveClass("border");
	});
	it("Renders with medium outline", () => {
		render(<MoltenMessageBlock outline="md">{messageText}</MoltenMessageBlock>);

		//Make sure the message div is present
		const messageBlock = screen.getByTestId("mattrixwv-molten-message-block");
		expect(messageBlock).toBeInTheDocument();
		expect(messageBlock).toHaveTextContent(messageText);
		//Check for the medium outline class
		expect(messageBlock).toHaveClass("border-2");
	});
	it("Renders with large outline", () => {
		render(<MoltenMessageBlock outline="lg">{messageText}</MoltenMessageBlock>);

		//Make sure the message div is present
		const messageBlock = screen.getByTestId("mattrixwv-molten-message-block");
		expect(messageBlock).toBeInTheDocument();
		expect(messageBlock).toHaveTextContent(messageText);
		//Check for the large outline class
		expect(messageBlock).toHaveClass("border-3");
	});
});

describe("Rounded Variants", () => {
	it("Renders with no rounding", () => {
		render(<MoltenMessageBlock rounded="none">{messageText}</MoltenMessageBlock>);

		//Make sure the message div is present
		const messageBlock = screen.getByTestId("mattrixwv-molten-message-block");
		expect(messageBlock).toBeInTheDocument();
		expect(messageBlock).toHaveTextContent(messageText);
		//Check for the no rounding class
		expect(messageBlock).toHaveClass("rounded-none");
	});
	it("Renders with extra small rounding", () => {
		render(<MoltenMessageBlock rounded="xs">{messageText}</MoltenMessageBlock>);

		//Make sure the message div is present
		const messageBlock = screen.getByTestId("mattrixwv-molten-message-block");
		expect(messageBlock).toBeInTheDocument();
		expect(messageBlock).toHaveTextContent(messageText);
		//Check for the extra small rounding class
		expect(messageBlock).toHaveClass("rounded-xs");
	});
	it("Renders with small rounding", () => {
		render(<MoltenMessageBlock rounded="sm">{messageText}</MoltenMessageBlock>);

		//Make sure the message div is present
		const messageBlock = screen.getByTestId("mattrixwv-molten-message-block");
		expect(messageBlock).toBeInTheDocument();
		expect(messageBlock).toHaveTextContent(messageText);
		//Check for the small rounding class
		expect(messageBlock).toHaveClass("rounded-sm");
	});
	it("Renders with medium rounding", () => {
		render(<MoltenMessageBlock rounded="md">{messageText}</MoltenMessageBlock>);

		//Make sure the message div is present
		const messageBlock = screen.getByTestId("mattrixwv-molten-message-block");
		expect(messageBlock).toBeInTheDocument();
		expect(messageBlock).toHaveTextContent(messageText);
		//Check for the medium rounding class
		expect(messageBlock).toHaveClass("rounded-md");
	});
	it("Renders with large rounding", () => {
		render(<MoltenMessageBlock rounded="lg">{messageText}</MoltenMessageBlock>);

		//Make sure the message div is present
		const messageBlock = screen.getByTestId("mattrixwv-molten-message-block");
		expect(messageBlock).toBeInTheDocument();
		expect(messageBlock).toHaveTextContent(messageText);
		//Check for the large rounding class
		expect(messageBlock).toHaveClass("rounded-lg");
	});
	it("Renders with extra large rounding", () => {
		render(<MoltenMessageBlock rounded="xl">{messageText}</MoltenMessageBlock>);

		//Make sure the message div is present
		const messageBlock = screen.getByTestId("mattrixwv-molten-message-block");
		expect(messageBlock).toBeInTheDocument();
		expect(messageBlock).toHaveTextContent(messageText);
		//Check for the extra large rounding class
		expect(messageBlock).toHaveClass("rounded-xl");
	});
});
