require 'spec_helper'

vcr_options = { :cassette_name => "machinereading_element", :record => :new_episodes }

describe Machinereading::Element, vcr: vcr_options do
  
  before(:each) do
    Machinereading.configure do |c|
      c.api_key = "uf8t28vY4U6w0cU7269O0zORI4h5yz7uhfzBmvBUPJeSVlvmJE"
      c.endpoint = "http://www.machinereading.com"
    end
    @sample_content = "Mio padre che mi spinge a mangiare e guai se non finisco mio padre che vuol farmi guidare mi frena con il fischio il bambino più grande mi mena davanti a tutti gli altri lui che passa per caso mi salva e mi condanna per sempre mio padre di spalle sul piatto si mangia la vita e poi sulla pista da ballo fa un valzer dentro il suo nuovo vestito  Per sempre solo per sempre cosa sarà mai porvarvi dentro solo tutto il tempo per sempre solo per sempre c'è un istante che rimane lì piantato eternamente E lei che non si lascia afferrare si piega indietro e ride e lei che dice quanto mi ama e io che mi fido e lei che mi toccava per prima la sua mano bambina vuole che le giuri qualcosa le si gonfia una vena e lei che era troppo più forte sicura di tutto e prima di andarsene mi dà il profilo con un movimento perfetto Per sempre solo per sempre cosa sarà mai portarvi dentro solo tutto il tempo per sempre solo per sempre c'è un istante che rimane lì piantato eternamente per sempre solo per sempre Mia madre che prepara la cena cantando sanremo carezza la testa a mio padre gli dice vedrai che ce la faremo Per sempre solo per sempre cosa sarà mai portarvi dentro solo tutto il tempo per sempre solo per sempre c'è un istante che rimane lì piantato eternamente per sempre solo per sempre"
    @sample_content_lang = "it"
  end

  it "initialize a new element" do
    element = Machinereading::Element.new(@sample_content, @sample_content_lang)
    expect(element).to be_an_instance_of(Machinereading::Element)
    expect(element.text).not_to be_nil
    expect(element.text).to eq(@sample_content)
    expect(element.lang).not_to be_nil
    expect(element.lang).to eq(@sample_content_lang)
  end

  it "make a request to 'tokenizer'" do
    element = Machinereading::Element.new(@sample_content, @sample_content_lang)
    response = element.tokenizer
    expect(response).not_to be_empty
  end

  it "make a request to 'pos_tagger_stanford'" do
    element = Machinereading::Element.new(@sample_content, @sample_content_lang)
    response = element.pos_tagger_stanford
    expect(response).not_to be_empty
  end

  it "make a request to 'pos_tagger_stanford' with additional params" do
    element = Machinereading::Element.new(@sample_content, @sample_content_lang)
    response = element.pos_tagger_stanford("horizontal")
    expect(response).not_to be_empty
  end

  it "make a request to 'syntactic_parser_stanford'" do
    element = Machinereading::Element.new(@sample_content, @sample_content_lang)
    response = element.syntactic_parser_stanford
    expect(response).not_to be_empty
  end

  it "make a request to 'lemmatizer'" do
    element = Machinereading::Element.new(@sample_content, @sample_content_lang)
    response = element.lemmatizer
    expect(response).to be_an_instance_of(Array)
  end

  it "make a request to 'sequence_surprisal'" do
    element = Machinereading::Element.new(@sample_content, @sample_content_lang)
    response = element.sequence_surprisal
    expect(response).to be_an_instance_of(Array)
    response.each do |r|
      expect(r["SEQUENCE"]).to be_an_instance_of(Array)
    end
  end

  it "make a request to 'language_detector'" do
    element = Machinereading::Element.new(@sample_content, nil)
    response = element.language_detector
    expect(response).to be_an_instance_of(Hash)
    expect(response["detected_languages"]).to be_an_instance_of(Array)
    response["detected_languages"].each do |r|
      expect(r["label"]).not_to be_nil
      expect(r["score"]).not_to be_nil
    end
  end

  it "make a request to 'keyword_extractor'" do
    element = Machinereading::Element.new(@sample_content, @sample_content_lang)
    response = element.keyword_extractor
    expect(response).to be_an_instance_of(Array)
    response.each do |r|
      expect(r["rating"]).not_to be_nil
      expect(r["keyword"]).not_to be_nil
    end
  end

  it "make a request to 'keyword_extractor'" do
    element = Machinereading::Element.new(@sample_content, @sample_content_lang)
    response = element.keyword_extractor(50)
    expect(response).to be_an_instance_of(Array)
    response.each do |r|
      expect(r["rating"]).not_to be_nil
      expect(r["keyword"]).not_to be_nil
    end
  end

  it "make a request to 'automatic_categorization'" do
    element = Machinereading::Element.new(@sample_content, @sample_content_lang)
    response = element.automatic_categorization
    expect(response).to be_an_instance_of(Hash)
    expect(response["categories"]).to be_an_instance_of(Array)
    expect(response["keywords"]).to be_an_instance_of(Array)
    response["keywords"].each do |r|
      expect(r["occ"]).not_to be_nil
      expect(r["keyword"]).not_to be_nil
    end
  end

  it "make a request to 'voice_tags'" do
    element = Machinereading::Element.new(@sample_content, @sample_content_lang)
    response = element.voice_tags
    expect(response).to be_an_instance_of(Hash)
    expect(response["positive_words"]).to be_an_instance_of(Array)
    expect(response["negative_words"]).to be_an_instance_of(Array)
    expect(response["voice_tags"]).to be_an_instance_of(Hash)
  end

  it "raise exception on wrong config parameters" do
    Machinereading.configure do |c|
      c.api_key = "bad-api-key"
      c.endpoint = "not-an-url-endpoint"
    end
    element = Machinereading::Element.new(@sample_content, @sample_content_lang)
    # raise Machinereading::BadResponse
    expect { element.tokenizer }.to raise_error
  end

end