import { RouteResolver } from './routes';

const routes = {
  home: '',
  post: {
    _base: 'post',
    _id: {
      _base: ':postId',
      comment: 'comment/:commentId',
      revision: 'history/:revisionId/:someOtherVar/test',
    },
  },
};

const routeResolver = new RouteResolver(routes);

it('translating routes', () => {
  // Working basic resolves
  expect(routeResolver.getRoute('home')).toBe('/');
  expect(routeResolver.getRoute('post')).toBe('/post');
  expect(routeResolver.getRoute('post._id')).toBe('/post/:postId');
  expect(routeResolver.getRoute('post._id.comment')).toBe('/post/:postId/comment/:commentId');

  // Working translation resolves
  expect(routeResolver.getRoute('home')).toBe('/');
  expect(routeResolver.getRoute('post')).toBe('/post');
  expect(routeResolver.getRoute('post._id', { postId: 3 })).toBe('/post/3');
  expect(routeResolver.getRoute('post._id.comment',
    { postId: 3, commentId: 5 })).toBe('/post/3/comment/5');
  expect(routeResolver.getRoute('post._id.revision',
    { postId: 3, revisionId: 5, someOtherVar: 'a' })).toBe('/post/3/history/5/a/test');

  // Failing basic resolves
  expect(() => {
    routeResolver.getRoute('bad');
  }).toThrow();
  expect(() => {
    routeResolver.getRoute('home.bad');
  }).toThrow();
  expect(() => {
    routeResolver.getRoute('post._id.bad');
  }).toThrow();

  // Failing translations
  expect(() => {
    routeResolver.getRoute('home', { test: 4 });
  }).toThrow();
  expect(() => {
    routeResolver.getRoute('post._id', { test: 4 });
  }).toThrow();
  expect(() => {
    routeResolver.getRoute('post._id', { postId: 3, test: 4 });
  }).toThrow();
  expect(() => {
    routeResolver.getRoute('post._id.comment', { postId: 3, commentId: 5, test: 4 });
  }).toThrow();
  expect(() => {
    routeResolver.getRoute('post._id.comment', { postId: 3 });
  }).toThrow();
});

