Example #1
0
 const _setLatestReview = (value) => {
   return setLatestReview({
     userId,
     addonId,
     review: value,
   });
 };
Example #2
0
 const _setLatestReview = ({
   review = { ...fakeReview, id: 1 },
   ...params
 } = {}) => {
   return setLatestReview({
     addonId: 9,
     userId: 7,
     review,
     ...params,
   });
 };
 .then(() => {
   sinon.assert.calledWith(
     dispatch,
     setLatestReview({
       addonId,
       addonSlug,
       userId,
       versionId,
       review: null,
     }),
   );
 });
 return actions.submitReview(params).then(() => {
   sinon.assert.calledWith(
     dispatch,
     setLatestReview({
       addonId: reviewResult.addon.id,
       addonSlug: reviewResult.addon.slug,
       userId: reviewResult.user.id,
       versionId,
       review: reviewResult,
     }),
   );
 });
 .then(() => {
   mockApi.verify();
   sinon.assert.calledWith(dispatch, setReview(fakeReview));
   sinon.assert.calledWith(
     dispatch,
     setLatestReview({
       userId,
       addonId,
       addonSlug,
       versionId,
       review: fakeReview,
     }),
   );
 });
  const createStoreWithLatestReview = ({
    addon = createInternalAddon({ ...fakeAddon, id: 7663 }),
    review = fakeReview,
    userId = 92345,
  } = {}) => {
    const { store } = dispatchSignInActions({ userId });

    if (review) {
      store.dispatch(setReview(review));
    }
    store.dispatch(
      setLatestReview({
        addonId: addon.id,
        review,
        userId,
      }),
    );

    return { addon, review, userId, store };
  };
    it('does not render AddonReviewManager without a saved review', async () => {
      const addon = createInternalAddon({ ...fakeAddon, id: 7777 });
      const userId = 9876;
      const versionId = 1234;
      const { store } = dispatchSignInActions({ userId });

      store.dispatch(
        setLatestReview({
          addonId: addon.id,
          addonSlug: addon.slug,
          review: null,
          userId,
          versionId,
        }),
      );
      const root = renderInline({ addon, store, version: versionId });

      root.setState({ showTextEntry: true });

      expect(root.find(AddonReviewManager)).toHaveLength(0);
      expect(root.find(UserRating)).toHaveLength(1);
    });
  const createStoreWithLatestReview = ({
    addon = createInternalAddon(fakeAddon),
    review = fakeReview,
    userId = 92345,
    versionId = review ? review.version.id : fakeAddon.current_version.id,
  } = {}) => {
    const { store } = dispatchSignInActions({ userId });

    if (review) {
      store.dispatch(setReview(review));
    }
    store.dispatch(
      setLatestReview({
        addonId: addon.id,
        addonSlug: addon.slug,
        review,
        userId,
        versionId,
      }),
    );

    return store;
  };
Example #9
0
function* manageAddonReview(
  action: CreateAddonReviewAction | UpdateAddonReviewAction,
  { _delay = delay }: Options = {},
) {
  const { body, errorHandlerId, score } = action.payload;
  const errorHandler = createErrorHandler(errorHandlerId);

  const savingRating = !!score;
  const savingReview = !!body;

  yield put(errorHandler.createClearingAction());
  if (savingRating) {
    yield put(flashReviewMessage(STARTED_SAVE_RATING));
  }
  if (savingReview) {
    yield put(flashReviewMessage(STARTED_SAVE_REVIEW));
  }

  try {
    const state: AppState = yield select(getState);
    const baseParams = {
      apiState: state.api,
      body,
      score,
    };
    let params;

    let oldReview = null;
    if (action.type === CREATE_ADDON_REVIEW) {
      params = {
        ...baseParams,
        addonId: action.payload.addonId,
        versionId: action.payload.versionId,
      };
    } else if (action.type === UPDATE_ADDON_REVIEW) {
      params = {
        ...baseParams,
        reviewId: action.payload.reviewId,
      };
      oldReview = selectReview(state.reviews, action.payload.reviewId);
      invariant(
        oldReview,
        `review with ID=${action.payload.reviewId} does not exist in state`,
      );
    }
    invariant(
      params,
      `params was unexpectedly empty; action.type: ${action.type}`,
    );

    const submitParams: SubmitReviewParams = params;
    const reviewFromResponse: SubmitReviewResponse = yield call(
      submitReview,
      submitParams,
    );

    yield put(setReview(reviewFromResponse));

    if (savingRating) {
      yield put(flashReviewMessage(SAVED_RATING));
    }
    if (savingReview) {
      yield put(flashReviewMessage(SAVED_REVIEW));
      yield put(hideEditReviewForm({ reviewId: reviewFromResponse.id }));
    }

    if (!reviewFromResponse.is_developer_reply) {
      yield put(
        setLatestReview({
          addonId: reviewFromResponse.addon.id,
          review: reviewFromResponse,
          userId: reviewFromResponse.user.id,
        }),
      );

      yield put(
        updateRatingCounts({
          addonId: reviewFromResponse.addon.id,
          oldReview,
          newReview: createInternalReview(reviewFromResponse),
        }),
      );
    }

    // Make the message disappear after some time.
    yield _delay(FLASH_SAVED_MESSAGE_DURATION);
    yield put(hideFlashedReviewMessage());
  } catch (error) {
    log.warn(
      `Failed to create/update review with action ${action.type}: ${error}`,
    );
    yield put(errorHandler.createErrorAction(error));
    yield put(flashReviewMessage(ABORTED));
  }
}