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

# tests for the fetch component

describe 'Fetch component', ->
  c = null
  ins = null
  out = null
  error = null
  user = '21d50190-02a3-11e4-9191-0800200c9a66'
  beforeEach (done) ->
    @timeout 10000
    loader = new noflo.ComponentLoader baseDir
    loader.load 'harpy/Fetch', (err, instance) ->
      c = instance
      c.once 'ready', ->
        ins = noflo.internalSocket.createSocket()
        out = noflo.internalSocket.createSocket()
        error = noflo.internalSocket.createSocket()
        c.inPorts.in.attach ins
        c.outPorts.out.attach out
        c.outPorts.error.attach error
        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 'fetching a simple article', ->
    it 'should result in a proper item', (done) ->
      @timeout 10000
      groups = []
      received = false
      out.on 'begingroup', (group) ->
        groups.push group
      out.on 'data', (data) ->
        chai.expect(data).to.be.an 'object'
        chai.expect(data.id).to.equal 'http://bergie.iki.fi/blog/flowhub-gnome-dx/'
        chai.expect(data.options).to.eql
          site: 'bergie/bergie.iki.fi'
          user: user
          compress: true
          via:
            url: 'http://bergie.today'
        chai.expect(groups[0]).to.equal 'foo'
        chai.expect(data.metadata).to.be.an 'object'
        chai.expect(data.metadata.title).to.equal 'Flowhub and the GNOME Developer Experience'
        ###
        chai.expect(data.metadata.via).to.be.an 'object'
        chai.expect(data.metadata.via.url).to.equal 'http://bergie.today'
        chai.expect(data.metadata.via.name).to.equal 'bergie.today'
        ###
        received = true
      out.on 'endgroup', ->
        groups.pop()
      out.on 'disconnect', ->
        chai.expect(received).to.equal true
        done()
      error.on 'data', (err) ->
        done err

      ins.beginGroup 'foo'
      ins.send
        options:
          site: 'bergie/bergie.iki.fi'
          user: user
          compress: true
          via:
            url: 'http://bergie.today'
        url: 'http://bergie.iki.fi/blog/flowhub-gnome-dx/'
      ins.endGroup()
      ins.disconnect()

  describe '"fetching" a item with a HTML payload', ->
    it 'should result in a proper item', (done) ->
      @timeout 10000
      groups = []
      html = """
        <h1>Hello world</h1>
        <p>Foo bar baz</p>
      """
      received = false
      out.on 'begingroup', (group) ->
        groups.push group
      out.on 'data', (data) ->
        chai.expect(data).to.be.an 'object'
        chai.expect(data.id).to.equal 'http://example.net/foo'
        chai.expect(data.options).to.eql
          user: user
          compress: false
        chai.expect(groups[0]).to.equal 'bar'
        chai.expect(data.metadata).to.be.an 'object'
        chai.expect(data.html).to.equal html
        received = true
      out.on 'endgroup', ->
        groups.pop()
      out.on 'disconnect', ->
        chai.expect(received).to.equal true
        done()
      error.on 'data', (err) ->
        done err

      ins.beginGroup 'bar'
      ins.send
        url: 'http://example.net/foo'
        options:
          user: user
          compress: false
        content: html
        type: 'text/html'
      ins.endGroup()
      ins.disconnect()

  describe '"fetching" a item with a Markdown payload', ->
    it 'should result in a proper item', (done) ->
      @timeout 10000
      groups = []
      markdown = """
      # Hello world

      Foo bar baz
      """
      html = """
        <h1 id="hello-world">Hello world</h1>
        <p>Foo bar baz</p>
      """
      received = false
      out.on 'begingroup', (group) ->
        groups.push group
      out.on 'data', (data) ->
        chai.expect(data).to.be.an 'object'
        chai.expect(data.id).to.equal 'http://example.net/bar'
        chai.expect(data.options).to.eql
          user: user
          item: '77d9e363-0b5a-440c-8a42-92a58ffedd68'
          path: '_posts/2014-10-05-markdown.md'
          site: 'the-domains/foo'
          index: 5
          compress: false
        chai.expect(groups[0]).to.equal 'baz'
        chai.expect(data.metadata).to.be.an 'object'
        chai.expect(data.metadata['@type']).to.equal 'Article'
        chai.expect(data.html.trim()).to.equal html
        received = true
      out.on 'endgroup', ->
        groups.pop()
      out.on 'disconnect', ->
        chai.expect(received).to.equal true
        done()
      error.on 'data', (err) ->
        done err

      ins.beginGroup 'baz'
      ins.send
        url: 'http://example.net/bar'
        options:
          user: user
          item: '77d9e363-0b5a-440c-8a42-92a58ffedd68'
          path: '_posts/2014-10-05-markdown.md'
          site: 'the-domains/foo'
          index: 5
          compress: false
        content: markdown
        type: 'text/x-markdown'
      ins.endGroup()
      ins.disconnect()

  describe '"fetching" a item with a Frontmatterized Markdown payload', ->
    it 'should result in a proper item', (done) ->
      @timeout 10000
      groups = []
      markdown = """
      ---
      title: Hello
      tags:
      - one
      - two
      _type: Person
      description: This is an example
      ---
      # Hello second world

      Foo bar baz
      """
      html = """
        <h1 id="hello-second-world">Hello second world</h1>
        <p>Foo bar baz</p>
      """
      received = false
      #c.network.on 'data', (data) -> console.log data.id
      out.on 'begingroup', (group) ->
        groups.push group
      out.on 'data', (data) ->
        chai.expect(data).to.be.an 'object'
        chai.expect(data.id).to.equal 'http://example.net/baz'
        chai.expect(data.options).to.eql
          user: user
          path: '_posts/2014-10-06-frontmatter.md'
          compress: false
        chai.expect(groups[0]).to.equal 'baz'
        chai.expect(data.metadata).to.be.an 'object'
        chai.expect(data.metadata.title).to.equal 'Hello'
        chai.expect(data.metadata.tags).to.eql ['one', 'two']
        chai.expect(data.metadata.description).to.eql 'This is an example'
        chai.expect(data.metadata['@type']).to.equal 'Person'
        chai.expect(data.html.trim()).to.equal html
        received = true
      out.on 'endgroup', ->
        groups.pop()
      out.on 'disconnect', ->
        chai.expect(received).to.equal true
        done()
      error.on 'data', (err) ->
        done err

      ins.beginGroup 'baz'
      ins.send
        url: 'http://example.net/baz'
        options:
          user: user
          path: '_posts/2014-10-06-frontmatter.md'
          compress: false
        content: markdown
        type: 'text/x-markdown'
      ins.endGroup()
      ins.disconnect()
