noflo = require 'noflo'
path = require 'path'
fs = require 'fs'
chai = require 'chai'
baseDir = path.resolve __dirname, '../'

describe 'ItemToFrontmatter component', ->
  c = null
  ins = null
  out = null
  site = null
  beforeEach (done) ->
    @timeout 10000
    loader = new noflo.ComponentLoader baseDir
    loader.load 'harpy/ItemToFrontmatter', (err, instance) ->
      c = instance
      c.once 'ready', ->
        ins = noflo.internalSocket.createSocket()
        out = noflo.internalSocket.createSocket()
        site = noflo.internalSocket.createSocket()
        c.inPorts.in.attach ins
        c.outPorts.out.attach out
        c.outPorts.site.attach site
        c.network.start()
        setTimeout done, 1

  describe 'when instantiated', ->
    it 'should have an input port', ->
      chai.expect(c.inPorts.in).to.be.an 'object'
    it 'should have an output port', ->
      chai.expect(c.outPorts.out).to.be.an 'object'

  describe 'converting a tweet to frontmatterized Markdown', ->
    it 'should produce the expected result', (done) ->
      original = JSON.parse fs.readFileSync path.resolve __dirname, 'fixtures/frontmatter/1.json'
      expected = fs.readFileSync path.resolve(__dirname, 'fixtures/frontmatter/1.md'), 'utf-8'
      siteGroups = []
      groups = []
      site.on 'begingroup', (group) ->
        siteGroups.push group
      site.on 'data', (data) ->
        chai.expect(data).to.equal 'the-domains/bergie.iki.fi'
        chai.expect(siteGroups[0]).to.equal 'foo'
      site.on 'endgroup', ->
        siteGroups.pop()
      out.on 'begingroup', (group) ->
        groups.push group
      out.on 'data', (data) ->
        chai.expect(data).to.be.a 'string'
        chai.expect("#{data}\n").to.equal expected
        chai.expect(groups[0]).to.equal 'foo'
        done()
      ins.beginGroup 'foo'
      ins.send original
      ins.endGroup()
      ins.disconnect()
  describe 'converting a video to frontmatterized Markdown', ->
    it 'should produce the expected result', (done) ->
      original = JSON.parse fs.readFileSync path.resolve __dirname, 'fixtures/frontmatter/2.json'
      expected = fs.readFileSync path.resolve(__dirname, 'fixtures/frontmatter/2.md'), 'utf-8'
      siteGroups = []
      groups = []
      site.on 'begingroup', (group) ->
        siteGroups.push group
      site.on 'data', (data) ->
        chai.expect(data).to.equal 'the-domains/bergie.iki.fi'
        chai.expect(siteGroups[0]).to.equal 'foo'
      site.on 'endgroup', ->
        siteGroups.pop()
      out.on 'begingroup', (group) ->
        groups.push group
      out.on 'data', (data) ->
        chai.expect(data).to.be.a 'string'
        chai.expect("#{data}\n").to.equal expected
        chai.expect(groups[0]).to.equal 'foo'
        done()
      ins.beginGroup 'foo'
      ins.send original
      ins.endGroup()
      ins.disconnect()
