You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

71 lines
2.6 KiB

  1. # frozen_string_literal: true
  2. require 'rails_helper'
  3. RSpec.describe TranslationService::LibreTranslate do
  4. subject(:service) { described_class.new('https://libretranslate.example.com', 'my-api-key') }
  5. before do
  6. stub_request(:get, 'https://libretranslate.example.com/languages').to_return(
  7. body: '[{"code": "en","name": "English","targets": ["de","es"]},{"code": "da","name": "Danish","targets": ["en","de"]}]'
  8. )
  9. end
  10. describe '#supported?' do
  11. it 'supports included language pair' do
  12. expect(service.supported?('en', 'de')).to be true
  13. end
  14. it 'does not support reversed language pair' do
  15. expect(service.supported?('de', 'en')).to be false
  16. end
  17. it 'supports auto-detecting source language' do
  18. expect(service.supported?(nil, 'de')).to be true
  19. end
  20. it 'does not support auto-detecting for unsupported target language' do
  21. expect(service.supported?(nil, 'pt')).to be false
  22. end
  23. end
  24. describe '#languages' do
  25. subject(:languages) { service.send(:languages) }
  26. it 'includes supported source languages' do
  27. expect(languages.keys).to eq ['en', 'da', nil]
  28. end
  29. it 'includes supported target languages for source language' do
  30. expect(languages['en']).to eq %w(de es)
  31. end
  32. it 'includes supported target languages for auto-detected language' do
  33. expect(languages[nil]).to eq %w(de es en)
  34. end
  35. end
  36. describe '#translate' do
  37. it 'returns translation with specified source language' do
  38. stub_request(:post, 'https://libretranslate.example.com/translate')
  39. .with(body: '{"q":"Hasta la vista","source":"es","target":"en","format":"html","api_key":"my-api-key"}')
  40. .to_return(body: '{"translatedText": "See you"}')
  41. translation = service.translate('Hasta la vista', 'es', 'en')
  42. expect(translation.detected_source_language).to eq 'es'
  43. expect(translation.provider).to eq 'LibreTranslate'
  44. expect(translation.text).to eq 'See you'
  45. end
  46. it 'returns translation with auto-detected source language' do
  47. stub_request(:post, 'https://libretranslate.example.com/translate')
  48. .with(body: '{"q":"Guten Morgen","source":"auto","target":"en","format":"html","api_key":"my-api-key"}')
  49. .to_return(body: '{"detectedLanguage":{"confidence":92,"language":"de"},"translatedText":"Good morning"}')
  50. translation = service.translate('Guten Morgen', nil, 'en')
  51. expect(translation.detected_source_language).to be_nil
  52. expect(translation.provider).to eq 'LibreTranslate'
  53. expect(translation.text).to eq 'Good morning'
  54. end
  55. end
  56. end