Manual Reference Source Test

test/unit/helpers.badge.js

import test from 'ava';
import sinon from 'sinon';
import {
  client,
  Badge,
} from '../../src';

// See tests.js for testing client creation
const badgeJsonApi = {
  id: 15,
  type: 'badges',
  attributes: {
    created_at: '2017-08-09T17:26:59Z',
    updated_at: '2017-08-09T17:26:59Z',
    title: 'dummy_1082',
    description: 'Demo Content info...',
    redemption_points: 250,
    image: {
      url: '/uploads/test/reward/image/15/1.png',
      small: {
        url: '/uploads/test/reward/image/15/small_1.png'
      },
      small_hd: {
        url: '/uploads/test/reward/image/15/small_hd_1.png'
      },
      fullscreen: {
        url: '/uploads/test/reward/image/15/fullscreen_1.png'
      },
      main: {
        url: '/uploads/test/reward/image/15/main_1.png'
      },
      fullscreen_hd: {
        url: '/uploads/test/reward/image/15/fullscreen_hd_1.png'
      },
      main_hd: {
        url: '/uploads/test/reward/image/15/main_hd_1.png'
      }
    },
    position: 4,
    enabled: true,
    featured: null,
    based_on: null,
    threshold: null,
    time_unit: null,
    start_point: null,
    start_at: null,
    disabled_image: {
      url: '/default/default.png',
      small: {
        url: '/default/small_default.png'
      },
      small_hd: {
        url: '/default/small_hd_default.png'
      },
      fullscreen: {
        url: '/default/fullscreen_default.png'
      },
      main: {
        url: '/default/main_default.png'
      },
      fullscreen_hd: {
        url: '/default/fullscreen_hd_default.png'
      },
      main_hd: {
        url: '/default/main_hd_default.png'
      }
    },
    cache_token: 'fOjCfFKZhjE'
  }
};
const badgeJson = {
  id: 15,
  type: 'badges',
  created_at: '2017-08-09T17:26:59Z',
  updated_at: '2017-08-09T17:26:59Z',
  title: 'dummy_1082',
  description: 'Demo Content info...',
  redemption_points: 250,
  image: {
    url: '/uploads/test/reward/image/15/1.png',
    small: {
      url: '/uploads/test/reward/image/15/small_1.png'
    },
    small_hd: {
      url: '/uploads/test/reward/image/15/small_hd_1.png'
    },
    fullscreen: {
      url: '/uploads/test/reward/image/15/fullscreen_1.png'
    },
    main: {
      url: '/uploads/test/reward/image/15/main_1.png'
    },
    fullscreen_hd: {
      url: '/uploads/test/reward/image/15/fullscreen_hd_1.png'
    },
    main_hd: {
      url: '/uploads/test/reward/image/15/main_hd_1.png'
    }
  },
  position: 4,
  enabled: true,
  featured: null,
  based_on: null,
  threshold: null,
  time_unit: null,
  start_point: null,
  start_at: null,
  disabled_image: {
    url: '/default/default.png',
    small: {
      url: '/default/small_default.png'
    },
    small_hd: {
      url: '/default/small_hd_default.png'
    },
    fullscreen: {
      url: '/default/fullscreen_default.png'
    },
    main: {
      url: '/default/main_default.png'
    },
    fullscreen_hd: {
      url: '/default/fullscreen_hd_default.png'
    },
    main_hd: {
      url: '/default/main_hd_default.png'
    }
  },
  cache_token: 'fOjCfFKZhjE'
};

test.before('start server', () => {
  client.apiBaseUrl = 'https://somesite.Clinical6.com';
  client.authToken = 'valid_token';
});

test.beforeEach((t) => {
  client.cache = 'never';
  client.authToken = 'valid_token';
  t.context.server = sinon.fakeServer.create();
  t.context.server.autoRespond = true;

  t.context.server.respondWith('DELETE', `${client.apiBaseUrl}/v3/badges/*`,
    [200, { 'Content-Type': 'application/json' }, JSON.stringify({ status: 'ok' })]);

  t.context.server.respondWith('PATCH', `${client.apiBaseUrl}/v3/badges/*`,
    [200, { 'Content-Type': 'application/json' }, JSON.stringify({
      data: {
        id: '4',
        type: 'badges',
        attributes: {
          created_at: '2017-08-09T17:26:59Z',
          updated_at: '2017-08-09T17:26:59Z',
          title: 'dummy_1065',
          description: 'Demo Content info...',
          redemption_points: 250,
          image: {
            url: '/uploads/test/reward/image/4/1.png',
            small: {
              url: '/uploads/test/reward/image/4/small_1.png'
            },
            small_hd: {
              url: '/uploads/test/reward/image/4/small_hd_1.png'
            },
            fullscreen: {
              url: '/uploads/test/reward/image/4/fullscreen_1.png'
            },
            main: {
              url: '/uploads/test/reward/image/4/main_1.png'
            },
            fullscreen_hd: {
              url: '/uploads/test/reward/image/4/fullscreen_hd_1.png'
            },
            main_hd: {
              url: '/uploads/test/reward/image/4/main_hd_1.png'
            }
          },
          position: 4,
          enabled: true,
          featured: null,
          based_on: null,
          threshold: null,
          time_unit: null,
          start_point: null,
          start_at: null,
          disabled_image: {
            url: '/default/default.png',
            small: {
              url: '/default/small_default.png'
            },
            small_hd: {
              url: '/default/small_hd_default.png'
            },
            fullscreen: {
              url: '/default/fullscreen_default.png'
            },
            main: {
              url: '/default/main_default.png'
            },
            fullscreen_hd: {
              url: '/default/fullscreen_hd_default.png'
            },
            main_hd: {
              url: '/default/main_hd_default.png'
            }
          },
          cache_token: 'iP78O8Ag65c'
        }
      }
    })]);

  t.context.server.respondWith('POST', `${client.apiBaseUrl}/v3/badges`,
    [201, { 'Content-Type': 'application/json' }, JSON.stringify({
      data: {
        id: '16',
        type: 'badges',
        attributes: {
          created_at: '2017-08-09T16:23:56Z',
          updated_at: '2017-08-09T16:23:56Z',
          title: 'dummy_459',
          description: 'Demo Content info...',
          redemption_points: 250,
          image: {
            url: '/default/default.png',
            small: {
              url: '/default/small_default.png'
            },
            small_hd: {
              url: '/default/small_hd_default.png'
            },
            fullscreen: {
              url: '/default/fullscreen_default.png'
            },
            main: {
              url: '/default/main_default.png'
            },
            fullscreen_hd: {
              url: '/default/fullscreen_hd_default.png'
            },
            main_hd: {
              url: '/default/main_hd_default.png'
            }
          },
          position: 4,
          enabled: true,
          featured: null,
          based_on: null,
          threshold: null,
          time_unit: null,
          start_point: null,
          start_at: null,
          disabled_image: {
            url: '/default/default.png',
            small: {
              url: '/default/small_default.png'
            },
            small_hd: {
              url: '/default/small_hd_default.png'
            },
            fullscreen: {
              url: '/default/fullscreen_default.png'
            },
            main: {
              url: '/default/main_default.png'
            },
            fullscreen_hd: {
              url: '/default/fullscreen_hd_default.png'
            },
            main_hd: {
              url: '/default/main_hd_default.png'
            }
          },
          cache_token: '3F2Lr5caMIQ'
        }
      }
    })]);

  t.context.storage = client.storageUtility;
  client.badge = new Badge({});
  t.context.badgeJsonApi = {
    data: {
      type: 'badges',
      attributes: {
        title: 'dummy_1065',
        description: 'Demo Content info...',
        redemption_points: 250
      }
    }
  };
  t.context.badge = new Badge(t.context.badgeJsonApi);
});

test.afterEach(t => t.context.server.restore());

/**
 * @test {Badge}
 */
test('[unit] Badge should handle badge data with a normal json format', (t) => {
  const badge = new Badge(badgeJson);
  t.is(badge.id, 15);
  t.is(badge.type, 'badges');
  t.is(badge.createdAt, '2017-08-09T17:26:59Z');
  t.is(badge.updatedAt, '2017-08-09T17:26:59Z');
  t.is(badge.title, 'dummy_1082');
  t.is(badge.description, 'Demo Content info...');
  t.is(badge.redemptionPoints, 250);
  t.is(badge.image.url, '/uploads/test/reward/image/15/1.png');
  t.is(badge.position, 4);
  t.is(badge.enabled, true);
  t.is(badge.featured, null);
  t.is(badge.basedOn, null);
  t.is(badge.threshold, null);
  t.is(badge.timeUnit, null);
  t.is(badge.startPoint, null);
  t.is(badge.startAt, null);
  t.is(badge.disabledImage.url, '/default/default.png');
  t.is(badge.cacheToken, 'fOjCfFKZhjE');
});

/**
 * @test {Badge}
 */
test('[unit] Badge should handle badge data with json api format', (t) => {
  const badge = new Badge({ data: badgeJsonApi });
  t.is(badge.id, 15);
  t.is(badge.type, 'badges');
  t.is(badge.createdAt, '2017-08-09T17:26:59Z');
  t.is(badge.updatedAt, '2017-08-09T17:26:59Z');
  t.is(badge.title, 'dummy_1082');
  t.is(badge.description, 'Demo Content info...');
  t.is(badge.redemptionPoints, 250);
  t.is(badge.image.url, '/uploads/test/reward/image/15/1.png');
  t.is(badge.position, 4);
  t.is(badge.enabled, true);
  t.is(badge.featured, null);
  t.is(badge.basedOn, null);
  t.is(badge.threshold, null);
  t.is(badge.timeUnit, null);
  t.is(badge.startPoint, null);
  t.is(badge.startAt, null);
  t.is(badge.disabledImage.url, '/default/default.png');
  t.is(badge.cacheToken, 'fOjCfFKZhjE');
});

/**
 * @test {Badge}
 */
test('[unit] Badge should generate json api format when converted to string', (t) => {
  let badge = new Badge({ data: badgeJsonApi });
  t.deepEqual(badge.toJSON(), badgeJsonApi);

  badge = new Badge({ data: badgeJsonApi });
  t.deepEqual(badge.toJSON(), badgeJsonApi);
});

/**
 * @test {Badge.delete}
 */
test('[unit] Badge.delete should successfully delete a badge', async (t) => {
  const badge = new Badge({ data: badgeJsonApi });
  const response = await badge.delete();

  // const request = t.context.server.requests[0];
  // t.is(request.method, 'DELETE');
  // t.is(request.url, `${client.apiBaseUrl}/v3/badges/${badge.id}`);
  // t.is(request.requestHeaders.Accept, 'application/json');
  // t.is(request.requestHeaders['Content-Type'], 'application/json;charset=utf-8');
  // t.is(request.requestHeaders.Authorization, 'Token token=valid_token');
  t.truthy(response);
});

/**
 * @test {Badge.save}
 */
test('[unit] Badge.save should successfully insert a badge with a badge object when id does not exist', async (t) => {
  const json = JSON.parse(JSON.stringify(badgeJsonApi));
  delete json.id;
  const badge = new Badge({ data: json });
  const response = await badge.save();

  // const request = t.context.server.requests[0];
  // t.is(request.method, 'POST');
  // t.is(request.url, `${client.apiBaseUrl}/v3/badges`);
  // t.is(request.requestHeaders.Accept, 'application/json');
  // t.deepEqual(JSON.parse(request.requestBody), { data: json });
  // t.is(request.requestHeaders['Content-Type'], 'application/json;charset=utf-8');
  // t.is(request.requestHeaders.Authorization, 'Token token=valid_token');
  t.is(response.id, 16);
  t.is(response.type, 'badges');
});

/**
 * @test {Badge.save}
 */
test('[unit] Badge.save should successfully update a badge with a badge object when id exists', async (t) => {
  const badge = new Badge({ data: badgeJsonApi });
  const response = await badge.save();

  // const request = t.context.server.requests[0];
  // t.is(request.method, 'PATCH');
  // t.is(request.url, `${client.apiBaseUrl}/v3/badges/${badge.id}`);
  // t.is(request.requestHeaders.Accept, 'application/json');
  // t.deepEqual(JSON.parse(request.requestBody), { data: badgeJsonApi });
  // t.is(request.requestHeaders['Content-Type'], 'application/json;charset=utf-8');
  // t.is(request.requestHeaders.Authorization, 'Token token=valid_token');
  t.is(response.id, 4);
  t.is(response.type, 'badges');
});