department-of-veterans-affairs/vets-website

View on GitHub
src/applications/_mock-form-ae-design-patterns/mocks/endpoints/feature-toggles/index.js

Summary

Maintainability
C
1 day
Test Coverage
const { snakeCase } = require('lodash');

// add and remove feature toggles here by name, but generally keep all values as false
// instead use generateFeatureToggles in server.js to set the toggle values
const profileToggles = {
  profileUseExperimental: false,
};

const makeAllTogglesTrue = toggles => {
  const result = { ...toggles };
  Object.keys(result).forEach(key => {
    result[key] = true;
  });
  return result;
};

/**
 * Generates feature toggles mock api response object for profile app
 *
 * @param {*} values - set specific values to true or false
 * @param {*} allOn - set all values to true
 * @returns
 */
const generateFeatureToggles = (values = profileToggles, allOn = false) => {
  const toggles = allOn
    ? makeAllTogglesTrue(profileToggles)
    : { ...profileToggles, ...values };

  const togglesCamelCased = Object.entries(toggles).map(([key, value]) => {
    return {
      name: key,
      value,
    };
  });

  const togglesSnakeCased = Object.entries(toggles).map(([key, value]) => {
    return {
      name: snakeCase(key),
      value,
    };
  });

  return {
    data: {
      type: 'feature_toggles',
      features: [...togglesSnakeCased, ...togglesCamelCased],
    },
  };
};

const generateFeatureTogglesState = (
  values = profileToggles,
  allOn = false,
) => {
  return {
    featureToggles: generateFeatureToggles(values, allOn).data.features.reduce(
      (acc, cur) => {
        acc[cur.name] = cur.value;
        return acc;
      },
      { loading: false },
    ),
  };
};

module.exports = { generateFeatureToggles, generateFeatureTogglesState };