import { mount } from "@vue/test-utils";
import {
baseClassCase,
colorSchemeClassCase,
controlIdAbsenceCase,
controlIdAutogeneratedCase,
controlIdPresenceCase,
elementValueAttrCase,
fontSizeClassCase,
minControlWidthCase,
offsetCase,
propStringCase,
propVNodeCase,
roundingClassCase,
sizeClassCase,
slotCase,
tagCase,
transitionClassCase,
} from "@/utils/test-case-factories";
import DProgress from "@/components/atoms/d-progress";
import DCaption from "@/components/atoms/d-caption";
import DLoader from "@/components/atoms/d-loader";
import config from "@/components/atoms/d-progress/config";
import { Type } from "@/components/atoms/d-progress/types";
import sleep from "@/utils/sleep";
import { COLOR_SCHEME } from "@darwin-studio/ui-codegen/dist/constants/color-scheme";
import { ROUNDING } from "@darwin-studio/ui-codegen/dist/constants/rounding";
import { SIZE } from "@darwin-studio/ui-codegen/dist/constants/size";
import { TRANSITION } from "@darwin-studio/ui-codegen/dist/constants/transition";
import prepareCssClassName from "@darwin-studio/ui-codegen/src/utils/prepareCssClassName";
import codegenConfig from "@darwin-studio/ui-codegen/config.json";
describe("DProgress", () => {
const wrapper = mount(DProgress);
baseClassCase(wrapper, config.class);
controlIdAbsenceCase(wrapper, `.${config.progressOptions.class}`);
controlIdPresenceCase(wrapper, `.${config.progressOptions.class}`);
controlIdAutogeneratedCase(wrapper, `.${config.progressOptions.class}`);
propStringCase(wrapper, `.${config.labelOptions.class}`, "label");
propVNodeCase(wrapper, `.${config.labelOptions.class}`, "label");
slotCase(DProgress, `.${config.labelOptions.class}`, "label");
offsetCase(wrapper, `.${config.labelOptions.class}`, "labelOffset");
// TODO: props.labelOptions
elementValueAttrCase(wrapper, 34, `.${config.progressOptions.class}`);
it("Should render linear variant if props.type === Type.linear", async () => {
await wrapper.setProps({
type: Type.linear,
value: 99,
});
const progressEl = wrapper.find(`.${config.progressOptions.class}`);
expect(progressEl.classes()).toContain(config.linearClass);
});
it("Should render circular variant if props.type === Type.linear", async () => {
await wrapper.setProps({
type: Type.circular,
value: 99,
});
const progressEl = wrapper.find(`.${config.progressOptions.class}`);
expect(progressEl.classes()).toContain(config.circularClass);
});
it("Should render linear progress content as '${props.value}%'", async () => {
const value = 19;
await wrapper.setProps({
type: Type.linear,
value,
});
const progressEl = wrapper.find(`.${config.progressOptions.class}`);
expect(progressEl.text()).toBe(`${value}%`);
});
// TODO: props.progressOptions
propStringCase(wrapper, `.${config.contentOptions.class}`, "content");
propVNodeCase(wrapper, `.${config.contentOptions.class}`, "content");
slotCase(DProgress, `.${config.contentOptions.class}`, "default", {
value: 12,
});
// TODO: props.contentOptions
it(`Should render props.caption as string`, async () => {
const caption = "some text content";
const wrapper = mount(DProgress, { props: { caption, value: 56 } });
await sleep(0); // Should wait next event loop step for asyncComponent to be imported
const captionEl = wrapper.find(`.${config.captionOptions.class}`);
expect(captionEl?.text()).toMatch(caption);
});
// TODO: reactivity is broken
it(`Should render prop.caption as VNode`, async () => {
const caption =
some caption html
;
const captionHtml = `${caption}`;
const wrapper = mount(DProgress, { props: { caption: captionHtml } });
await sleep(0); // Should wait next event loop step for asyncComponent to be imported
const captionEl = wrapper.find(`.${config.captionOptions.class}`);
expect(captionEl.html()).toMatch(captionHtml);
});
slotCase(DProgress, `.${config.captionOptions.class}`, "caption");
// TODO: reactivity is broken
it(`Should render props.captionOffset to the label style as '--offset: props.captionOffset'`, async () => {
const captionOffset = "12%";
const wrapper = mount(DProgress, {
props: { captionOffset: captionOffset, caption: "Not empty" },
});
await sleep(0); // Should wait next event loop step for asyncComponent to be imported
const targetEl = wrapper.find(`.${config.captionOptions.class}`);
expect(targetEl.attributes("style")).toContain(
`--offset: ${captionOffset}`
);
});
// TODO: props.captionOptions
colorSchemeClassCase(
wrapper,
`.${config.progressOptions.class}`,
COLOR_SCHEME.ALTERNATIVE,
{ value: 11 }
);
it(`Should pass props.colorScheme to the DLoader`, async () => {
const colorScheme = COLOR_SCHEME.SECONDARY;
await wrapper.setProps({ colorScheme, value: undefined });
await sleep(0); // Should wait next event loop step for asyncComponent to be imported
const loaderComp = wrapper.findComponent(DLoader);
expect(loaderComp?.props().colorScheme).toBe(colorScheme);
});
colorSchemeClassCase(
wrapper,
`.${config.contentOptions.class}`,
COLOR_SCHEME.DANGER,
{ value: 11 }
);
roundingClassCase(wrapper, `.${config.progressOptions.class}`, {
value: 99,
});
it(`Should pass props.rounding to the DLoader`, async () => {
const rounding = ROUNDING.SMALL;
await wrapper.setProps({
value: undefined,
rounding,
loaderOptions: { rounding },
});
await sleep(0); // Should wait next event loop step for asyncComponent to be imported
const loaderComp = wrapper.findComponent(DLoader);
expect(loaderComp?.props().rounding).toBe(rounding);
});
roundingClassCase(wrapper, `.${config.contentOptions.class}`, {
type: Type.circular,
value: 99,
content: "Not empty",
});
fontSizeClassCase(wrapper, `.${config.class}`);
sizeClassCase(wrapper, `.${config.class}`);
it(`Should pass props.size as size and font to the DLoader`, async () => {
const size = SIZE.SMALL;
await wrapper.setProps({
value: undefined,
size,
loaderOptions: { size },
});
await sleep(0); // Should wait next event loop step for asyncComponent to be imported
const loaderComp = wrapper.findComponent(DLoader);
expect(loaderComp?.props().size).toBe(size);
expect(loaderComp?.props().font).toBe(size);
});
it(`Should pass props.size font to DCaption`, async () => {
const size = SIZE.SMALL;
const wrapper = mount(DProgress, {
props: {
value: 78,
size,
caption: "Not empty",
captionOptions: { size },
},
});
await sleep(0); // Should wait next event loop step for asyncComponent to be imported
const captionComp = wrapper.findComponent(DCaption);
expect(captionComp?.props().font).toBe(size);
});
minControlWidthCase(wrapper, `.${config.linearClass}`, {
type: Type.linear,
value: 99,
});
transitionClassCase(wrapper, `.${config.progressOptions.class}`, {
value: 32,
});
it(`Should render props.transition to DLoader classes`, async () => {
const transition = TRANSITION.AVERAGE;
await wrapper.setProps({ transition, value: undefined });
await sleep(0); // Should wait next event loop step for asyncComponent to be imported
const loaderComp = wrapper.findComponent(DLoader);
expect(loaderComp?.props().transition).toBe(transition);
});
// TODO: reactivity is broken
it(`Should render props.transition to .caption transition class`, async () => {
const transition = TRANSITION.AVERAGE;
const wrapper = mount(DProgress, {
props: { transition, value: 83, caption: "Not empty" },
});
const className = prepareCssClassName(
codegenConfig.TOKENS.TRANSITION.CSS_CLASS_PREFIX,
transition
);
const targetEl = wrapper.find(`.${config.captionOptions.class}`);
expect(targetEl.classes()).toContain(className);
});
tagCase(wrapper);
propStringCase(wrapper, `.${config.loaderContainerClass}`, "loader", {
value: undefined,
});
propVNodeCase(wrapper, `.${config.loaderContainerClass}`, "loader", {
value: undefined,
});
slotCase(DProgress, `.${config.loaderContainerClass}`, "loader", {
value: undefined,
});
// TODO: props.loaderOptions
// TODO: indeterminate -> branches
// TODO: aria attrs
});