Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | 58x 58x 58x 116x 58x 8x 8x 8x 8x 8x 8x 8x 8x 58x 11x 11x 11x 11x 11x 11x 58x 9x 58x 58x 9x 9x 9x 9x 9x 9x 58x 10x 10x 10x 10x 10x | import type Sinon from "cypress/types/sinon";
import React from "react";
import type { ComponentStoryCy, ComponentStoryObjCy } from "orphic-cypress";
import { ClickCount } from "stories";
 
// With both of these, you'd probably just be passing in normal functions,
// but here we're spying for the sake of meta-test assertions.
const hasCypress = Boolean((global as any).Cypress);
const dumbFunction = () => 1;
const [onClickSpy, onClickSpy2] = [...Array(2).keys()].map(() =>
  hasCypress
    ? Cypress.sinon.spy(dumbFunction)
    : /* istanbul ignore next */ // story-code @skip
      dumbFunction
);
 
export default {
  component: ClickCount,
  argTypes: {
    onClick: { action: "myClickStub" },
  },
  args: {
    // not tested until SpyOnArgsWhichAreProvidedInDefaultExport
    onClick2: onClickSpy2,
  },
};
 
export const StubActionsDefinedOnDefaultExport: ComponentStoryObjCy<
  typeof ClickCount
> = {
  cy: () => {
    // just arbitrarily using the nesting data-cy here, no particular need
    cy.dataCy("click-container").dataCy("count").should("contain", 0);
    // arbitrarily trying the unlikely approach to dataCy
    cy.dataCy("click-container").then(($clickContainer) =>
      cy.dataCy($clickContainer, "count").should("contain", 0)
    );
    cy.dataCy("button").click();
 
    // name on actions is `onClick`
    cy.get("@actions").its("onClick").should("be.calledOnceWith", 0);
    // but the action string also functions as an alias
    cy.get("@myClickStub").should("be.calledOnceWith", 0);
    // and if it would have come from argtypes regex as well, then
    cy.get("@argTypesRegex.onClick").should("be.calledOnceWith", 0);
 
    cy.dataCy("count").should("contain", 1);
  },
};
// story-code @include-start
 
export const SpyOnArgsWhichAreAlreadyProvided: ComponentStoryObjCy<
  typeof ClickCount
> = {
  args: {
    onClick: onClickSpy,
  },
  cy: () => {
    (onClickSpy as Sinon.SinonSpy).resetHistory();
    cy.dataCy("button")
      .click()
      // So the spy itself is already called (you'd probably just provide a normal function)
      .then(() => expect(onClickSpy).to.be.calledOnceWith(0));
    // And then the important thing: actions object wraps that provided function in a spy
    cy.get("@actions").its("onClick").should("be.calledOnceWith", 0);
    // still aliased as the argtype name as well and not from regex
    cy.get("@myClickStub").should("be.calledOnceWith", 0);
    cy.get("@argTypesRegex.onClick").should("be.calledOnceWith", 0);
  },
};
 
export const SpyOnProvided: ComponentStoryCy<typeof ClickCount> = (args) => (
  <ClickCount {...args} />
);
SpyOnProvided.args = {
  onClick: onClickSpy,
};
SpyOnProvided.cy = () => {
  (onClickSpy as Sinon.SinonSpy).resetHistory();
  cy.dataCy("button")
    .click()
    .then(() => expect(onClickSpy).to.be.calledOnceWith(0));
  cy.get("@actions").its("onClick").should("be.calledOnceWith", 0);
  cy.get("@myClickStub").should("be.calledOnceWith", 0);
  cy.get("@argTypesRegex.onClick").should("be.calledOnceWith", 0);
};
// story-code @end SpyOnProvided
 
export const SpyOnArgsWhichAreProvidedInDefaultExport: ComponentStoryObjCy<
  typeof ClickCount
> = {
  cy: () => {
    (onClickSpy2 as Sinon.SinonSpy).resetHistory();
    cy.dataCy("button-2")
      .click()
      .then(() => expect(onClickSpy2).to.be.calledOnceWith(0));
    cy.get("@actions").its("onClick2").should("be.calledOnceWith", 0);
    // No argTypes provided for onClick2, so this goes to the argTypesRegex generated stub
    cy.get("@argTypesRegex.onClick2").should("be.calledOnceWith", 0);
  },
};
  |