/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
import React, { useRef } from "react";
import { mount } from "enzyme";
import { useWidgetCelebration } from "content-src/components/Widgets/useWidgetCelebration";
function TestComponent({ onRender }) {
const widgetRef = useRef(null);
const celebration = useWidgetCelebration(widgetRef);
onRender(celebration);
return
;
}
function NullRefComponent({ onRender }) {
const celebration = useWidgetCelebration({ current: null });
onRender(celebration);
return ;
}
describe("useWidgetCelebration", () => {
let sandbox;
let originalMatchMedia;
beforeEach(() => {
originalMatchMedia = window.matchMedia;
sandbox = sinon.createSandbox();
sandbox
.stub(Element.prototype, "getBoundingClientRect")
.returns({ width: 300, height: 200 });
});
afterEach(() => {
sandbox.restore();
window.matchMedia = originalMatchMedia;
});
it("returns initial state", () => {
let state;
mount( (state = s)} />);
assert.isFalse(state.isCelebrating);
assert.isNull(state.celebrationFrame);
assert.equal(state.celebrationId, 0);
});
it("triggerCelebration sets isCelebrating to true", () => {
let state;
const wrapper = mount( (state = s)} />);
state.triggerCelebration();
wrapper.update();
assert.isTrue(state.isCelebrating);
});
it("triggerCelebration increments celebrationId on each call", () => {
let state;
const wrapper = mount( (state = s)} />);
state.triggerCelebration();
wrapper.update();
assert.equal(state.celebrationId, 1);
state.triggerCelebration();
wrapper.update();
assert.equal(state.celebrationId, 2);
});
it("triggerCelebration sets celebrationFrame from widget dimensions", () => {
let state;
const wrapper = mount( (state = s)} />);
state.triggerCelebration();
wrapper.update();
assert.equal(state.celebrationFrame.width, 300);
assert.equal(state.celebrationFrame.height, 200);
assert.equal(state.celebrationFrame.strokeInset, 1.5);
});
it("triggerCelebration does nothing when widgetRef.current is null", () => {
let state;
const wrapper = mount( (state = s)} />);
state.triggerCelebration();
wrapper.update();
assert.isFalse(state.isCelebrating);
});
it("triggerCelebration does nothing when prefers-reduced-motion is set", () => {
let state;
window.matchMedia = () => ({ matches: true });
const wrapper = mount( (state = s)} />);
state.triggerCelebration();
wrapper.update();
assert.isFalse(state.isCelebrating);
});
it("completeCelebration sets isCelebrating to false", () => {
let state;
const wrapper = mount( (state = s)} />);
state.triggerCelebration();
wrapper.update();
assert.isTrue(state.isCelebrating);
state.completeCelebration();
wrapper.update();
assert.isFalse(state.isCelebrating);
});
});