#--
# wwwjdic
# © 2014 Marco Bresciani
#
# This file is part of wwwjdic.
#
# wwwjdic is free software: you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation, either version 3 of the License, or (at your
# option) any later version.
#
# wwwjdic is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# for more details.
#
# You should have received a copy of the GNU General Public License
# along with wwwjdic. If not, see .
#
# SPDX-FileCopyrightText: 2014 Marco Bresciani
#
# SPDX-License-Identifier: GPL-3.0-or-later
#++
require_relative '../test_helper'
describe WWWJDic::WWWJDic do
describe 'when created' do
subject { WWWJDic::WWWJDic.new(WWWJDic.parser) }
# Basic checks for instance and default results
it 'shall return a valid object' do
_(subject).wont_be_nil
_(subject).must_be_instance_of WWWJDic::WWWJDic
end
it 'shall return the URI with basic language' do
_(subject.to_s).must_equal WWWJDic::TEST_REFERENCE_URI
end
# Tests for server selection
describe 'when selecting a server' do
describe 'when an invalid server is selected' do
['', nil, :invalid].each do |a_server|
it 'shall raise an error' do
assert_raises ArgumentError do
subject.server = a_server
end
end
it 'shall return the reference URI' do
_(subject.to_s).must_equal WWWJDic::TEST_REFERENCE_URI
end
end
end
WWWJDic::URIS.each do |name, uri|
describe "when server '#{name}' is selected" do
it "shall return the proper '#{uri}'" do
subject.server = name
_(subject.server).must_equal uri
_(subject.to_s).must_include uri
end
end
end
end
# Tests for dictionary selection
describe 'when selecting a dictionary' do
['', nil].each do |a_dict|
describe "when an invalid dictionary '#{a_dict}' is selected" do
it 'shall raise an error' do
assert_raises ArgumentError do
subject.dictionary = a_dict
end
end
it 'shall return the reference URI' do
_(subject.to_s).must_equal WWWJDic::TEST_REFERENCE_URI
end
end
end
WWWJDic::DICTIONARY_CODES.each do |dict_number|
describe "when dictionary '#{dict_number}' is selected" do
it "shall return the proper number '#{dict_number}'" do
subject.dictionary = dict_number
_(subject.dictionary).must_equal WWWJDic::DICTS_BY_CODES[dict_number]
_(subject.to_s).must_equal WWWJDic::URI_DEFAULT + dict_number + WWWJDic::DISPLAY[:regular]
end
end
end
it 'shall return the URI with basic dictionary when reset' do
subject.dictionary = 'R'
subject.reset
_(subject.to_s).must_equal WWWJDic::TEST_REFERENCE_URI
_(subject.dictionary).must_equal WWWJDic::DICTIONARY_NAMES[0]
end
WWWJDic::DICTIONARY_NAMES.each do |dict_name|
describe "when dictionary '#{dict_name}' is selected" do
it "shall return the proper name '#{dict_name}'" do
subject.dictionary = dict_name
_(subject.dictionary).must_equal dict_name
_(subject.to_s).must_equal WWWJDic::URI_DEFAULT + WWWJDic::DICTS_BY_NAMES[dict_name] + WWWJDic::DISPLAY[:regular]
end
end
end
it 'shall return the URI with basic dictionary when reset' do
subject.dictionary = 'Japanese-Italian'
subject.reset
_(subject.to_s).must_equal WWWJDic::TEST_REFERENCE_URI
_(subject.dictionary).must_equal WWWJDic::DICTIONARY_NAMES[0]
end
end
# Tests for translations
describe 'when asking for a translation' do
I18n.load_path = Dir[File.join(File.dirname(__FILE__), '/locales/', '*.yml')]
# Tests for translation URIs
describe 'when asking for URI' do
['', nil].each do |a_word|
describe "when providing an invalid parameter '#{a_word}'" do
%i[uri raw_uri json_uri].each do |a_method|
it "shall raise an error for #{a_method} request" do
assert_raises ArgumentError do
subject.send a_method
end
end
end
end
end
describe 'when considering multiple languages' do
WWWJDic::AVAIL_LANGS.each_pair do |dict, number|
I18n.locale = dict.to_s
a_word = I18n.t('test.kotoba')
%i[uri raw_uri json_uri].each do |a_method|
it "shall return URI containing '#{number}' for a '#{dict}' word for '#{a_method}' request" do
_(subject.send(a_method, a_word, dict: WWWJDic::AVAIL_LANGS[dict])).must_include number
end
it "shall return URI containing '#{a_word}' for a '#{dict}' word for '#{a_method}' request" do
_(subject.send(a_method, a_word, dict: WWWJDic::AVAIL_LANGS[dict])).must_include CGI.escape(a_word).to_s
end
end
it 'shall override user-custom display parameter for raw display' do
_(subject.raw_uri(a_word, display: :regular, dict: WWWJDic::AVAIL_LANGS[dict])).must_include WWWJDic::DISPLAY[:raw]
end
it "shall return correct JSON data containing '#{a_word}' and the proper URI" do
json = subject.json_uri(a_word, dict: WWWJDic::AVAIL_LANGS[dict])
an_uri = subject.uri(a_word, dict: WWWJDic::AVAIL_LANGS[dict])
_(JSON.parse(json).keys).must_include a_word
_(JSON.parse(json)[a_word]).must_equal an_uri
end
end
end
end
end
# Tests for translation URIs
describe 'when asking to retrieve a translation' do
%i[translate json_translate].each do |a_method|
describe "when the translation is '#{a_method}'" do
['', nil].each do |a_word|
it "shall raise ArgumentError when an invalid word '#{a_word}' is proposed" do
assert_raises ArgumentError do
subject.send(a_method, a_word)
end
end
it "shall raise ArgumentError when an invalid word '#{a_word}' is proposed, for raw display" do
assert_raises ArgumentError do
subject.send(a_method, a_word)
end
end
end
describe 'when considering multiple languages' do
I18n.load_path = Dir[File.join(File.dirname(__FILE__), 'locales/', '*.yml')]
WWWJDic::AVAIL_LANGS.each_pair do |dict, number|
I18n.locale = dict.to_s
a_word = I18n.t('test.kotoba')
it 'shall create a saved file with the proper filename' do
filename = "File_#{a_word}"
subject.send(a_method, a_word, nil, filename)
_(File.exist?(filename)).must_equal true
File.delete filename
end
it "shall return the translated word '#{a_word}'" do
translation = subject.send(a_method, a_word, dict: WWWJDic::AVAIL_LANGS[dict])
_(translation).wont_be_nil
_(translation).wont_be_empty
if a_method == :json_translate
_(JSON.parse(translation)).wont_include '
'
_(JSON.parse(translation)).wont_include ''
_(JSON.parse(translation).keys).must_include a_word
an_uri = subject.raw_uri(a_word, dict: WWWJDic::AVAIL_LANGS[dict])
_(an_uri).must_include number
_(JSON.parse(translation)[a_word]).must_equal an_uri
end
end
end
end
end
end
end
end
end