sharetribe/sharetribe

View on GitHub
client/app/specs/transitImmutableConverter.spec.js

Summary

Maintainability
C
1 day
Test Coverage
/* eslint-disable no-magic-numbers */

import { expect } from 'chai';
import Immutable from 'immutable';
import { createReader, createWriter } from '../utils/transitImmutableConverter';
import { UUID, Distance, Money } from '../types/types';
import t from 'transit-js';

describe('transitImmutableConverter', () => {

  const reader = createReader();
  const writer = createWriter();
  const rawReader = t.reader('json');
  const rawWriter = t.writer('json');

  it('encodes/decodes keywords', () => {
    const v = ':keyword';
    const encoded = writer.write(v);

    expect(t.isKeyword(rawReader.read(encoded))).to.equal(true);
    expect(Immutable.is(reader.read(encoded), v)).to.equal(true);
  });

  it('encodes/decodes Immutable.Lists', () => {
    const v = Immutable.List([1, 'a', true]);
    const encoded = writer.write(v);

    expect(Array.isArray(rawReader.read(encoded))).to.equal(true);
    expect(Immutable.is(reader.read(encoded), v)).to.equal(true);
  });

  it('encodes/decodes Immutable.Maps', () => {
    const v = Immutable.Map({ a: 1, true: 2 });
    const encoded = writer.write(v);

    expect(t.isMap(rawReader.read(encoded))).to.equal(true);
    expect(Immutable.is(reader.read(encoded), v)).to.equal(true);
  });

  it('encodes/decodes UUIDs', () => {
    const v = new UUID({ value: '00000000-0000-0000-0000-000000000000' });
    const encoded = writer.write(v);

    expect(t.isUUID(rawReader.read(encoded))).to.equal(true);
    expect(Immutable.is(reader.read(encoded), v)).to.equal(true);
  });

  it('encodes/decodes Distances', () => {
    const v = new Distance({ value: '12.3', unit: 'km' });
    const encoded = writer.write(v);

    expect(rawReader.read(encoded).tag).to.equal('di');
    expect(Immutable.is(reader.read(encoded), v)).to.equal(true);
  });

  it('encodes/decodes Money', () => {
    const v = new Money({ value: '500', unit: 'USD' });
    const encoded = writer.write(v);

    expect(rawReader.read(encoded).tag).to.equal('mn');
    expect(Immutable.is(reader.read(encoded), v)).to.equal(true);
  });

  it('decodes URIs', () => {
    const v = 'https://www.sharetribe.com';
    const encoded = rawWriter.write(t.uri(v));

    expect(Immutable.is(reader.read(encoded), v)).to.equal(true);
  });

  it('decodes lists to Immutable.List', () => {
    const v = [1, 2, 3];
    const encoded = rawWriter.write(t.list(v));

    expect(Immutable.is(reader.read(encoded), Immutable.List(v))).to.equal(true);
  });

  it('decodes localized strings', () => {
    const v = { en: 'Hello' };
    const encoded = rawWriter.write(t.tagged('lstr', v));

    expect(Immutable.is(reader.read(encoded), Immutable.Map(v))).to.equal(true);
  });

  it('encodes/decodes deep nested structure with various different types', () => {

    // This is an end-to-end integration test that all the read/write handlers
    // work nicely together.

    const v = Immutable.Map({
      'nested-map': Immutable.Map({
        a: 1,
        b: true,
        c: null,
      }),
      list: Immutable.List([1, 2, 3]),
      uuid: new UUID({ value: '00000000-0000-0000-0000-000000000000' }),
      distance: new Distance({ value: '12.3', unit: 'km' }),
      money: new Money({ fractionalAmount: 500, currency: 'USD' }),
      keyword: ':a',
      int: 1,
      float: 1.2,
      boolean: true,
    });

    expect(Immutable.is(reader.read(writer.write(v)), v)).to.equal(true);
  });

  it("let's you to define custom handlers", () => {
    const Color = function Color(hex) {
      this.hex = hex;
    };

    Color.prototype.valueOf = function valueOf() {
      return this.hex;
    };

    const ColorHandler = t.makeWriteHandler({
      tag: () => 'clr',
      rep: (v) => v.hex,
    });

    const toColor = (rep) => new Color(rep);

    const writeHandlers = [
      Color, ColorHandler,
    ];

    const readHandlers = {
      clr: toColor,
    };

    const reader2 = createReader(readHandlers);
    const writer2 = createWriter(writeHandlers);

    const v = new Color('11FF22');
    const encoded = writer2.write(v);

    expect(rawReader.read(encoded).tag).to.equal('clr');
    expect(Immutable.is(reader2.read(encoded), v)).to.equal(true);
  });
});