import {assert} from 'chai';
import {renderMarkdown, shouldRenderMarkdown} from './md-helper.js';

describe('shouldRenderMarkdown', () => {
  it('defaults to false', () => {
    const actual = shouldRenderMarkdown();
    assert.isFalse(actual);
  });

  it('returns true for enabled projects', () => {
    const actual = shouldRenderMarkdown({project:'astor',
      availableProjects: new Set(['astor'])});
    assert.isTrue(actual);
  });

  it('returns false for disabled projects', () => {
    const actual = shouldRenderMarkdown({project:'hazelnut',
      availableProjects: new Set(['astor'])});
    assert.isFalse(actual);
  });

  it('user pref can disable markdown', () => {
    const actual = shouldRenderMarkdown({project:'astor',
      enabledProjects: new Set(['astor']), enabled: false});
    assert.isFalse(actual);
  });
});

describe('renderMarkdown', () => {
  it('can render empty string', () => {
    const actual = renderMarkdown('');
    assert.equal(actual, '');
  });

  it('can render basic string', () => {
    const actual = renderMarkdown('hello world');
    assert.equal(actual, '<p>hello world</p>\n');
  });

  it('can render lists', () => {
    const input = '* First item\n* Second item\n* Third item\n* Fourth item';
    const actual = renderMarkdown(input);
    const expected = '<ul>\n<li>First item</li>\n<li>Second item</li>\n' +
        '<li>Third item</li>\n<li>Fourth item</li>\n</ul>\n';
    assert.equal(actual, expected);
  });

  it('can render headings', () => {
    const actual = renderMarkdown('# Heading level 1\n\n## Heading level 2');
    assert.equal(actual,
        '<h1>Heading level 1</h1>\n<h2>Heading level 2</h2>\n');
  });

  it('can render codeblocks', () => {
    const actual = renderMarkdown('```\nhello world\n```');
    assert.equal(actual,
      '<pre><code>hello world\n</code></pre>\n');
  });

  describe('can render links', () => {
    it('for simple links', () => {
      const actual = renderMarkdown('[clickme](http://google.com)');
      const expected = `<p><span class="annotated-link"><a title="" ` +
          `href="http://google.com"><span class="material-icons link">` +
          `link</span>clickme</a><span class="tooltip">Link destination: ` +
          `http://google.com</span></span></p>\n`;
      assert.equal(actual, expected);
    });

    it('and indicates malformed link', () => {
      const actual = renderMarkdown('[clickme](google.com)');
      const expected = `<p><span class="annotated-link"><a title="" ` +
          `href="google.com"><span class="material-icons link_off">link_off` +
          `</span>clickme</a><span class="tooltip">Link may be malformed: ` +
          `google.com</span></span></p>\n`;
      assert.equal(actual, expected);
    });

    it('correctly renders emails', () => {
      const actual = renderMarkdown('[person@google.com](mailto:person@google.com)');
      const expected = `<p><span class="annotated-link"><a title="" ` +
      `href="mailto:person@google.com"><span class="material-icons link">` +
      `link</span>person@google.com</a><span class="tooltip">Link destination: ` +
      `mailto:person@google.com</span></span></p>\n`;
      assert.equal(actual, expected);
    });

    it('correctly renders monorail user links', () => {
      const actual = renderMarkdown('[person@google.com](/u/person@google.com)');
      const expected = `<p><span class="annotated-link"><a title="" ` +
      `href="/u/person@google.com"><span class="material-icons ` +
      `link">link</span>person@google.com</a><span class="tooltip">Link destination: ` +
      `/u/person@google.com</span></span></p>\n`
      assert.equal(actual, expected)
    });

  });

  it('preserves bolding from description templates', () => {
    const input = `<b>What's the problem?</b>\n<b>1.</b> A\n<b>2.</b> B`;
    const actual = renderMarkdown(input);
    const expected = `<p><strong>What's the problem?</strong>\n<strong>1.` +
        `</strong> A\n<strong>2.</strong> B</p>\n`;
    assert.equal(actual, expected);
  });

  it('forbids src', () => {
    const actual = renderMarkdown('<video id="foo" src="//youtube" control></video>');
    assert.equal(actual, '<p><video id="foo"></video></p>\n');
  });
});
