Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 44 additions & 0 deletions packages/dom/src/lib/ElementAssertion.ts
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,50 @@ export class ElementAssertion<T extends Element> extends Assertion<T> {
});
}

/**
* Asserts that the element has one or more of the specified CSS styles.
*
* @example
* ```
* expect(component).toHaveSomeStyle({ color: 'green', display: 'block' });
* ```
*
* @param expected the expected CSS style/s.
* @returns the assertion instance.
*/

public toHaveSomeStyle(expected: Partial<CSSStyleDeclaration>): this {

const [expectedStyle, elementProcessedStyle] = getExpectedAndReceivedStyles(this.actual, expected);

if (!expectedStyle || !elementProcessedStyle) {
throw new Error("No available styles.");
}

const hasSomeStyle = Object.entries(expectedStyle).some(([expectedProp, expectedValue]) => {
return Object.entries(elementProcessedStyle).some(([receivedProp, receivedValue]) => {
return equal(expectedProp, receivedProp) && equal(expectedValue, receivedValue);
});
});

const error = new AssertionError({
actual: this.actual,
message: `Expected the element to match some of the following styles:\n${JSON.stringify(expectedStyle, null, 2)}`,
});

const invertedError = new AssertionError({
actual: this.actual,
// eslint-disable-next-line max-len
message: `Expected the element NOT to match some of the following styles:\n${JSON.stringify(expectedStyle, null, 2)}`,
});

return this.execute({
assertWhen: hasSomeStyle,
error,
invertedError,
});
}

/**
* Helper method to assert the presence or absence of class names.
*
Expand Down
43 changes: 43 additions & 0 deletions packages/dom/test/unit/lib/ElementAssertion.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -368,4 +368,47 @@ describe("[Unit] ElementAssertion.test.ts", () => {
});
});
});

describe(".toHaveSomeStyle", () => {
context("when the element contains one or more expected styles", () => {
it("returns the assertion instance", () => {
const { getByTestId } = render(
<div
style={{ color: "blue", maxHeight: "3rem", width: "2rem" }}
data-testid="test-div"
/>,
);
const divTest = getByTestId("test-div");
const test = new ElementAssertion(divTest);

expect(test.toHaveSomeStyle({ color: "red", display: "flex", height: "3rem", width: "2rem" })).toBeEqual(test);

expect(() => test.not.toHaveSomeStyle({ color: "blue" }))
.toThrowError(AssertionError)
// eslint-disable-next-line max-len
.toHaveMessage("Expected the element NOT to match some of the following styles:\n{\n \"color\": \"rgb(0, 0, 255)\"\n}");
});
});

context("when the element does not contain any of the expected styles", () => {
it("throws an assertion error", () => {
const { getByTestId } = render(
<div
className="foo bar test"
style={{ border: "1px solid black", color: "blue", display: "block" }}
data-testid="test-div"
/>,
);
const divTest = getByTestId("test-div");
const test = new ElementAssertion(divTest);

expect(() => test.toHaveSomeStyle({ color: "red", display: "flex" }))
.toThrowError(AssertionError)
// eslint-disable-next-line max-len
.toHaveMessage("Expected the element to match some of the following styles:\n{\n \"color\": \"rgb(255, 0, 0)\",\n \"display\": \"flex\"\n}");

expect(test.not.toHaveSomeStyle({ border: "1px solid blue", color: "red", display: "flex" })).toBeEqual(test);
});
});
});
});