export function useSyntheticsTest()

in src/hooks/useSyntheticsTest.ts [33:108]


export function useSyntheticsTest(steps: Steps): ITestContext {
  const [result, dispatch] = useReducer(resultReducer, undefined);
  const [isResultFlyoutVisible, setIsResultFlyoutVisible] = useState(false);
  const [codeBlocks, setCodeBlocks] = useState('');
  const [isTestInProgress, setIsTestInProgress] = useState(false);
  const { electronAPI } = useContext(CommunicationContext);

  const setResult = useCallback((data: Result | undefined) => {
    dispatch({
      event: 'override',
      data,
    });
  }, []);

  /**
   * The absence of steps with a truthy result indicates the result value
   * is stale, and should be destroyed.
   */
  useEffect(() => {
    if (steps.length === 0 && result) {
      setResult(undefined);
    }
  }, [steps.length, result, setResult]);

  const onTest = useCallback(
    async function () {
      const code = await getCodeFromActions(electronAPI, steps, 'inline');
      if (!isTestInProgress) {
        // destroy stale state
        dispatch({ data: undefined, event: 'override' });
        const onTestEventListener: TestEventListener = (_event, data) => {
          dispatch(data);
        };

        try {
          const promise = electronAPI.runTest(
            {
              steps,
              code,
              isProject: false,
            },
            onTestEventListener
          );
          setIsTestInProgress(true);
          setIsResultFlyoutVisible(true);
          await promise;
        } catch (e: unknown) {
          // eslint-disable-next-line no-console
          console.error(e);
        } finally {
          electronAPI.removeOnTestListener();
          setIsTestInProgress(false);
        }
      }
    },
    [electronAPI, isTestInProgress, steps]
  );

  useEffect(() => {
    if (result?.journey.status === 'failed') {
      getCodeForFailedResult(electronAPI, steps, result?.journey).then(code => setCodeBlocks(code));
    }
  }, [electronAPI, result?.journey, steps]);

  return {
    codeBlocks,
    isResultFlyoutVisible,
    isTestInProgress,
    result,
    onTest,
    setCodeBlocks,
    setIsResultFlyoutVisible,
    setIsTestInProgress,
    setResult,
  };
}