| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- import { Choices, LabelStudio, ToolBar } from "@humansignal/frontend-test/helpers/LSF";
- import { FF_CUSTOM_SCRIPT, FF_DEV_3873, FF_REVIEWER_FLOW } from "../../../../src/utils/feature-flags";
- enum RESPONSE_TYPE {
- DRAFT = "draft",
- SUBMIT = "submit",
- }
- const RESPONSE_DELAY = 100;
- const WAITING_FOR_EVENTS_DELAY = 200;
- describe("Annotation submitting process", () => {
- it("should not create a duplicate annotation if the annotation and draft are saved concurrently", () => {
- LabelStudio.addFeatureFlagsOnPageLoad({
- [FF_DEV_3873]: true,
- [FF_REVIEWER_FLOW]: true,
- [FF_CUSTOM_SCRIPT]: true,
- });
- // here will be stored an order of completed saving action
- // it consists of strings: "draft" and "submit"
- const callApi = cy.spy().as("callApi");
- LabelStudio.params()
- .data({
- text: "Some words",
- })
- .config(`<View>
- <Text name="text" value="$text" />
- <Choices toName="text" name="choice">
- <Choice value="ClickMe"/>
- </Choices>
- </View>`)
- // To have "new" annotation we need to use userGenerate
- .withAnnotation({ userGenerate: true, result: [] })
- .withEventListener("submitAnnotation", () => {
- callApi(RESPONSE_TYPE.SUBMIT);
- })
- .withEventListener("submitDraft", () => {
- return new Promise<void>((resolve) => {
- // initialize saving annotation exactly when request of saving draft should be sent to the server
- ToolBar.submitBtn.click();
- // this emulates server response delay
- setTimeout(() => {
- callApi(RESPONSE_TYPE.DRAFT);
- resolve();
- }, RESPONSE_DELAY);
- });
- })
- .init();
- // just to have something to save
- Choices.findChoice("ClickMe").click();
- // Preventing waiting for autosave. It will save time.
- cy.window().then(async (win) => {
- win.Htx.annotationStore.selected.saveDraftImmediately();
- });
- // Wait for all submit events to be invoked, to have `callOrder` ready to check
- cy.wait(WAITING_FOR_EVENTS_DELAY);
- // Check order
- cy.window().then((win) => {
- expect(callApi).to.be.calledTwice;
- expect(callApi.firstCall).to.be.calledWith(RESPONSE_TYPE.DRAFT);
- expect(callApi.secondCall).to.be.calledWith(RESPONSE_TYPE.SUBMIT);
- });
- });
- });
|