Only offer translation for supported languages (#23879)
parent
0872f3e3d7
commit
5a8c651e8f
13 changed files with 336 additions and 31 deletions
@ -0,0 +1,100 @@ |
||||
# frozen_string_literal: true |
||||
|
||||
require 'rails_helper' |
||||
|
||||
RSpec.describe TranslationService::DeepL do |
||||
subject(:service) { described_class.new(plan, 'my-api-key') } |
||||
|
||||
let(:plan) { 'advanced' } |
||||
|
||||
before do |
||||
stub_request(:get, 'https://api.deepl.com/v2/languages?type=source').to_return( |
||||
body: '[{"language":"EN","name":"English"},{"language":"UK","name":"Ukrainian"}]' |
||||
) |
||||
stub_request(:get, 'https://api.deepl.com/v2/languages?type=target').to_return( |
||||
body: '[{"language":"EN-GB","name":"English (British)"},{"language":"ZH","name":"Chinese"}]' |
||||
) |
||||
end |
||||
|
||||
describe '#supported?' do |
||||
it 'supports included languages as source and target languages' do |
||||
expect(service.supported?('uk', 'en')).to be true |
||||
end |
||||
|
||||
it 'supports auto-detecting source language' do |
||||
expect(service.supported?(nil, 'en')).to be true |
||||
end |
||||
|
||||
it 'supports "en" and "pt" as target languages though not included in language list' do |
||||
expect(service.supported?('uk', 'en')).to be true |
||||
expect(service.supported?('uk', 'pt')).to be true |
||||
end |
||||
|
||||
it 'does not support non-included language as target language' do |
||||
expect(service.supported?('uk', 'nl')).to be false |
||||
end |
||||
|
||||
it 'does not support non-included language as source language' do |
||||
expect(service.supported?('da', 'en')).to be false |
||||
end |
||||
end |
||||
|
||||
describe '#translate' do |
||||
it 'returns translation with specified source language' do |
||||
stub_request(:post, 'https://api.deepl.com/v2/translate') |
||||
.with(body: 'text=Hasta+la+vista&source_lang=ES&target_lang=en&tag_handling=html') |
||||
.to_return(body: '{"translations":[{"detected_source_language":"ES","text":"See you soon"}]}') |
||||
|
||||
translation = service.translate('Hasta la vista', 'es', 'en') |
||||
expect(translation.detected_source_language).to eq 'es' |
||||
expect(translation.provider).to eq 'DeepL.com' |
||||
expect(translation.text).to eq 'See you soon' |
||||
end |
||||
|
||||
it 'returns translation with auto-detected source language' do |
||||
stub_request(:post, 'https://api.deepl.com/v2/translate') |
||||
.with(body: 'text=Guten+Tag&source_lang&target_lang=en&tag_handling=html') |
||||
.to_return(body: '{"translations":[{"detected_source_language":"DE","text":"Good Morning"}]}') |
||||
|
||||
translation = service.translate('Guten Tag', nil, 'en') |
||||
expect(translation.detected_source_language).to eq 'de' |
||||
expect(translation.provider).to eq 'DeepL.com' |
||||
expect(translation.text).to eq 'Good Morning' |
||||
end |
||||
end |
||||
|
||||
describe '#languages?' do |
||||
it 'returns source languages' do |
||||
expect(service.send(:languages, 'source')).to eq ['en', 'uk', nil] |
||||
end |
||||
|
||||
it 'returns target languages' do |
||||
expect(service.send(:languages, 'target')).to eq %w(en-gb zh en pt) |
||||
end |
||||
end |
||||
|
||||
describe '#request' do |
||||
before do |
||||
stub_request(:any, //) |
||||
# rubocop:disable Lint/EmptyBlock |
||||
service.send(:request, :get, '/v2/languages') { |res| } |
||||
# rubocop:enable Lint/EmptyBlock |
||||
end |
||||
|
||||
it 'uses paid plan base URL' do |
||||
expect(a_request(:get, 'https://api.deepl.com/v2/languages')).to have_been_made.once |
||||
end |
||||
|
||||
context 'with free plan' do |
||||
let(:plan) { 'free' } |
||||
|
||||
it 'uses free plan base URL' do |
||||
expect(a_request(:get, 'https://api-free.deepl.com/v2/languages')).to have_been_made.once |
||||
end |
||||
end |
||||
|
||||
it 'sends API key' do |
||||
expect(a_request(:get, 'https://api.deepl.com/v2/languages').with(headers: { Authorization: 'DeepL-Auth-Key my-api-key' })).to have_been_made.once |
||||
end |
||||
end |
||||
end |
@ -0,0 +1,71 @@ |
||||
# frozen_string_literal: true |
||||
|
||||
require 'rails_helper' |
||||
|
||||
RSpec.describe TranslationService::LibreTranslate do |
||||
subject(:service) { described_class.new('https://libretranslate.example.com', 'my-api-key') } |
||||
|
||||
before do |
||||
stub_request(:get, 'https://libretranslate.example.com/languages').to_return( |
||||
body: '[{"code": "en","name": "English","targets": ["de","es"]},{"code": "da","name": "Danish","targets": ["en","de"]}]' |
||||
) |
||||
end |
||||
|
||||
describe '#supported?' do |
||||
it 'supports included language pair' do |
||||
expect(service.supported?('en', 'de')).to be true |
||||
end |
||||
|
||||
it 'does not support reversed language pair' do |
||||
expect(service.supported?('de', 'en')).to be false |
||||
end |
||||
|
||||
it 'supports auto-detecting source language' do |
||||
expect(service.supported?(nil, 'de')).to be true |
||||
end |
||||
|
||||
it 'does not support auto-detecting for unsupported target language' do |
||||
expect(service.supported?(nil, 'pt')).to be false |
||||
end |
||||
end |
||||
|
||||
describe '#languages' do |
||||
subject(:languages) { service.send(:languages) } |
||||
|
||||
it 'includes supported source languages' do |
||||
expect(languages.keys).to eq ['en', 'da', nil] |
||||
end |
||||
|
||||
it 'includes supported target languages for source language' do |
||||
expect(languages['en']).to eq %w(de es) |
||||
end |
||||
|
||||
it 'includes supported target languages for auto-detected language' do |
||||
expect(languages[nil]).to eq %w(de es en) |
||||
end |
||||
end |
||||
|
||||
describe '#translate' do |
||||
it 'returns translation with specified source language' do |
||||
stub_request(:post, 'https://libretranslate.example.com/translate') |
||||
.with(body: '{"q":"Hasta la vista","source":"es","target":"en","format":"html","api_key":"my-api-key"}') |
||||
.to_return(body: '{"translatedText": "See you"}') |
||||
|
||||
translation = service.translate('Hasta la vista', 'es', 'en') |
||||
expect(translation.detected_source_language).to eq 'es' |
||||
expect(translation.provider).to eq 'LibreTranslate' |
||||
expect(translation.text).to eq 'See you' |
||||
end |
||||
|
||||
it 'returns translation with auto-detected source language' do |
||||
stub_request(:post, 'https://libretranslate.example.com/translate') |
||||
.with(body: '{"q":"Guten Morgen","source":"auto","target":"en","format":"html","api_key":"my-api-key"}') |
||||
.to_return(body: '{"detectedLanguage":{"confidence":92,"language":"de"},"translatedText":"Good morning"}') |
||||
|
||||
translation = service.translate('Guten Morgen', nil, 'en') |
||||
expect(translation.detected_source_language).to be_nil |
||||
expect(translation.provider).to eq 'LibreTranslate' |
||||
expect(translation.text).to eq 'Good morning' |
||||
end |
||||
end |
||||
end |
Loading…
Reference in new issue