Dalphi/dalphi

View on GitHub
spec/requests/projects/merge_spec.rb

Summary

Maintainability
A
2 hrs
Test Coverage
require 'rails_helper'

RSpec.describe 'Project merge', type: :request do
  before(:each) do
    stub_request(:get, 'http://example.com/merge')
      .with(:headers => { 'Accept' => '*/*', 'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Host' => 'example.com', 'User-Agent' => 'Ruby' })
      .to_return(status: 200, body: '', headers: {})

    @project = FactoryGirl.create :project,
                                  merge_service: FactoryGirl.create(:merge_service_request_test)
    sign_in(@project.admin)
  end

  it 'combines annotation documents into a raw datum by sending them to a merge service' do
    arbitrary_interface_type = FactoryGirl.create(:interface_type)
    raw_datum = FactoryGirl.create :raw_datum,
                                   data: File.new("#{Rails.root}/spec/fixtures/text/unmerged.txt"),
                                   project: @project
    annotation_documents = [
      FactoryGirl.create(:annotation_document,
                       raw_datum: raw_datum,
                       interface_type: arbitrary_interface_type,
                       rank: 1,
                       payload: {
                         options: ['Enthält Personennamen', 'Enthält keine Personennamen'],
                         label: "Enthält Personennamen",
                         content: "par1",
                         paragraph_index: 0
                       }),
      FactoryGirl.create(:annotation_document,
                       raw_datum: raw_datum,
                       interface_type: arbitrary_interface_type,
                       rank: 2,
                       payload: {
                         options: ['Enthält Personennamen', 'Enthält keine Personennamen'],
                         label: "Enthält Personennamen",
                         content: "par2",
                         paragraph_index: 2
                       })
    ]

    expect(@project.merge_data.count).to eq(1)

    stub_request(:post, @project.merge_service.url)
      .to_return(
        body: {
          data: Base64.encode64(File.new("#{Rails.root}/spec/fixtures/text/merged.txt").read),
          id: raw_datum.id
        }.to_json
      )

    expect(RawDatum.count).to eq(1)
    expect(AnnotationDocument.count).to eq(2)

    post project_merge_path(@project)
    expect(response.header['Location'].gsub(/\?.*/, '')).to eq(project_annotation_documents_url(@project))

    expect(RawDatum.count).to eq(1)
    expect(AnnotationDocument.count).to eq(0)

    raw_datum.reload
    expect(File.new(raw_datum.data.path).read).to eq(
      File.new("#{Rails.root}/spec/fixtures/text/merged.txt").read
    )
  end

  it 'handles asynchronous processing of the merge service' do
    arbitrary_interface_type = FactoryGirl.create(:interface_type)
    raw_datum = FactoryGirl.create :raw_datum,
                                   data: File.new("#{Rails.root}/spec/fixtures/text/unmerged.txt"),
                                   project: @project
    annotation_documents = [
      FactoryGirl.create(:annotation_document,
                       raw_datum: raw_datum,
                       interface_type: arbitrary_interface_type,
                       rank: 1,
                       payload: {
                         options: ['Enthält Personennamen', 'Enthält keine Personennamen'],
                         label: "Enthält Personennamen",
                         content: "par1",
                         paragraph_index: 0
                       }),
      FactoryGirl.create(:annotation_document,
                       raw_datum: raw_datum,
                       interface_type: arbitrary_interface_type,
                       rank: 2,
                       payload: {
                         options: ['Enthält Personennamen', 'Enthält keine Personennamen'],
                         label: "Enthält Personennamen",
                         content: "par2",
                         paragraph_index: 2
                       })
    ]

    expect(@project.merge_data.count).to eq(1)

    stub_request(:post, @project.merge_service.url)
      .to_return(
        status: 200,
        body: {
          'status' => 'async'
        }.to_json
      )

    expect(RawDatum.count).to eq(1)
    expect(AnnotationDocument.count).to eq(2)

    post project_merge_path(@project)
    expect(response.header['Location'].gsub(/\?.*/, '')).to eq(project_annotation_documents_url(@project))

    expect(RawDatum.count).to eq(1)
    expect(AnnotationDocument.count).to eq(2)
  end

  it 'handles errors of merge service' do
    arbitrary_interface_type = FactoryGirl.create(:interface_type)
    raw_datum = FactoryGirl.create :raw_datum,
                                   data: File.new("#{Rails.root}/spec/fixtures/text/unmerged.txt"),
                                   project: @project
    annotation_documents = [
      FactoryGirl.create(:annotation_document,
                       raw_datum: raw_datum,
                       interface_type: arbitrary_interface_type,
                       rank: 1,
                       payload: {
                         options: ['Enthält Personennamen', 'Enthält keine Personennamen'],
                         label: "Enthält Personennamen",
                         content: "par1",
                         paragraph_index: 0
                       }),
      FactoryGirl.create(:annotation_document,
                       raw_datum: raw_datum,
                       interface_type: arbitrary_interface_type,
                       rank: 2,
                       payload: {
                         options: ['Enthält Personennamen', 'Enthält keine Personennamen'],
                         label: "Enthält Personennamen",
                         content: "par2",
                         paragraph_index: 2
                       })
    ]

    expect(@project.merge_data.count).to eq(1)

    stub_request(:post, @project.merge_service.url)
      .to_return(
        status: 500
      )

    expect(RawDatum.count).to eq(1)
    expect(AnnotationDocument.count).to eq(2)

    post project_merge_path(@project)
    expect(response.header['Location'].gsub(/\?.*/, '')).to eq(project_annotation_documents_url(@project))

    expect(RawDatum.count).to eq(1)
    expect(AnnotationDocument.count).to eq(2)

    raw_datum.reload
    expect(File.new(raw_datum.data.path).read).to eq(
      File.new("#{Rails.root}/spec/fixtures/text/unmerged.txt").read
    )
  end
end