Closed dhilt closed 6 years ago
@dhilt Как я это вижу по пунктам:
Проверяем есть ли такой запрос и откликается ли на него сервер (ждем ответа 200)
Сначала ищем несуществующий термин - в ответ должно прийти вроде {success: true, result: []}
Задаем поиск в виде строки "test term". Тут мы должны получить два термина, и еще надо бы чтобы к каждому термину приложили руку два переводчика. Переменная result с сервера должна будет иметь примерно следующий вид
[{ wylie: 'chos',
sanskrit_rus: 'дхамма, дхарма',
sanskrit_rus_lower: 'дхамма, дхарма',
sanskrit_eng: 'Dharma',
sanskrit_eng_lower: 'dharma',
translations: [ [Object], [Object] ],
id: 'chos' },
{ wylie: 'chos sku',
sanskrit_rus: 'Дхармакая',
sanskrit_rus_lower: 'дхармакая',
sanskrit_eng: 'dharmakaya',
sanskrit_eng_lower: 'dharmakaya',
translations: [ [Object], [Object] ],
id: 'chos_sku' }]
Смотрим каждый ли термин имеет поля wylie, sanskrit_rus, sanskrit_rus_lower, sanskrit_eng, sanskrit_eng_lower, translations, id, и все ли эти поля одинаковы с testTranslation и testTranslation2. В translations должны лежать переводы от двух переводчиков, один будет русский, второй английский. В объектах, лежащих внутри translations, также проверяем все ли поля на месте, и сделаны ли переводы двумя тестовыми переводчиками.
Затем в поиске участвует строка "test term 2" и мы ожидаем всего один термин. И также смотрим все ли поля на месте, вcе ли соответствует testTerm2 и testTranslation2, два ли там переводчика и их ли это переводы в точности как описано _shared.js.
Вот как-то так наверное. Но перед этим тестом надо будет собственно додумать создание двух терминов, двух разноязычных переводчиков, более-менее адекватные переводы и еще может что-то всплывет. Буду пробовать в общем.
@dhilt Пока что вижу несостыковку в виде полей sanskrit_rus, sanskrit_rus_lower, sanskrit_eng, sanskrit_eng_lower. У всех давних терминов эти поля присутствуют, но наш клиент и метод на сервере termsController.create() построены так, что эти поля вовсе не требуются. Наверное мы этот момент упустили и его надо дописывать.
@BitDen Хорошее замечание! Прошу: https://github.com/dhilt/dharmadict/issues/20.
@BitDen Я согласен с твоим планом, но это только начало! дальше нужно будет тестировать собственно переводы, translations-meanings. Но пока, на первой итерации давай ограничимся самими терминами.
@dhilt Нуу... В общем я это сообщение прочитал только сейчас, и уже написал тесты также на translations-meanings. Вот коммит: https://github.com/dhilt/dharmadict/commit/05ae62f8411fe21fbe8d3334df7fdc33a39966c0
Дополнительно заметил что каждый translations от каждого автора должен содержать в объекте данных 'language'. Также убрал лишний id, который в лишний раз записывался в '_source' - у старых терминов не было подобного, вот и убрал. А id у самого документа в базе данных остается, с этим порядок, там есть переменная termId. Коммит: https://github.com/dhilt/dharmadict/commit/6249c2aa0b60cc3db5d1e7187201e8e88e7d1f20
Так полностью выглядит 'test term' в базе данных:
{
"_index" : "dharmadict",
"_type" : "terms",
"_id" : "test_term",
"_score" : 1.0,
"_source" : {
"wylie" : "test term",
"translations" : [
{
"translatorId" : "TEST-TRANSLATOR",
"meanings" : [
{
"versions" : [
"Translation test term (1)",
"Translation test term (2)",
"Translation test term (3)"
],
"comment" : "New test comment by admin",
"versions_lower" : [
"translation test term (1)",
"translation test term (2)",
"translation test term (3)"
]
},
{
"versions" : [
"Translation test term (4)",
"Translation test term (5)",
"Translation test term (6)"
],
"comment" : null,
"versions_lower" : [
"translation test term (4)",
"translation test term (5)",
"translation test term (6)"
]
}
],
"language" : "eng"
},
{
"translatorId" : "TEST-TRANSLATOR-2",
"meanings" : [
{
"versions" : [
"Translation test term (1)",
"Translation test term (2)",
"Translation test term (3)"
],
"comment" : "comment about test term",
"versions_lower" : [
"translation test term (1)",
"translation test term (2)",
"translation test term (3)"
]
},
{
"versions" : [
"Translation test term (4)",
"Translation test term (5)",
"Translation test term (6)"
],
"comment" : null,
"versions_lower" : [
"translation test term (4)",
"translation test term (5)",
"translation test term (6)"
]
}
],
"language" : "rus"
}
]
}
}
А это 'test term two':
{
"_index" : "dharmadict",
"_type" : "terms",
"_id" : "test_term_two",
"_score" : 1.0,
"_source" : {
"wylie" : "test term two",
"translations" : [
{
"translatorId" : "TEST-TRANSLATOR",
"meanings" : [
{
"versions" : [
"Translation test term 2 (1)",
"Translation test term 2 (2)",
"Translation test term 2 (3)"
],
"comment" : "comment about test term 2",
"versions_lower" : [
"translation test term 2 (1)",
"translation test term 2 (2)",
"translation test term 2 (3)"
]
},
{
"versions" : [
"Translation test term 2 (4)",
"Translation test term 2 (5)",
"Translation test term 2 (6)"
],
"comment" : null,
"versions_lower" : [
"translation test term 2 (4)",
"translation test term 2 (5)",
"translation test term 2 (6)"
]
}
],
"language" : "eng"
},
{
"translatorId" : "TEST-TRANSLATOR-2",
"meanings" : [
{
"versions" : [
"Translation test term 2 (1)",
"Translation test term 2 (2)",
"Translation test term 2 (3)"
],
"comment" : "comment about test term 2",
"versions_lower" : [
"translation test term 2 (1)",
"translation test term 2 (2)",
"translation test term 2 (3)"
]
},
{
"versions" : [
"Translation test term 2 (4)",
"Translation test term 2 (5)",
"Translation test term 2 (6)"
],
"comment" : null,
"versions_lower" : [
"translation test term 2 (4)",
"translation test term 2 (5)",
"translation test term 2 (6)"
]
}
],
"language" : "rus"
}
]
}
}
@BitDen Я очень хочу посмотреть это, но уже не могу... посмотри пока, что можно сдедать с интернационализацией. Соображения можно излагать в отдельной задаче. Если будет напрашиваться код, тоже пробуй в отдельном бранче. // Я выложил dev-бранч в production, кстати.
@dhilt Очень избыточно там понаписал, сейчас попробую подрефакторить тот код на searchTermSpec.js. Пока не подправлю, лучше туда правда не смотреть.
@dhilt Пока что убрал три огромных по своему смыслу одинаковых куска кода (который шел вглубь проверять "translations") и сделал одну функцию для этой проверки. Коммит: https://github.com/dhilt/dharmadict/commit/00669a12af1d42d1b6f495f5ee8d4a5bff1604e2 Наверное, больше не стоит другие данные заталкивать в новую функцию testTranslationsInTerm.
@dhilt И следом добавил проверку на поля с санскритом - https://github.com/dhilt/dharmadict/commit/8ca6624278badda8a692c5db4d231455dc65d20e.
И маленькая косметическая поправка + один нужный assert.equal
: https://github.com/dhilt/dharmadict/commit/587a28146cf757f7a24ad8f4de65c811f607b278
@dhilt И еще одна поправка, уже не маленькая: https://github.com/dhilt/dharmadict/commit/a9f82c40e0470c1147171d1cb4ff23bd1ef6cc2c.
Убедился что ставить точку с запятой и правда важно - если перед этой строкой с forEach https://github.com/dhilt/dharmadict/commit/a9f82c40e0470c1147171d1cb4ff23bd1ef6cc2c#diff-26cbe2770e715a4fc5c6dc388b3e2c42R44 написать console.log(_firstTranslation, _secondTranslation)
без точки с запятой, то прилетит интересная ошибка:
Uncaught TypeError: Cannot read property '#<Object>' of undefined
@dhilt А что с этим issue, можно его уже считать закрытым или тут остались еще какие-то вопросы?
Я заметил вот, что у нас не хватает тестов для /api/terms/translation
- нужно написать. И плюс хочется немного переписать метод findTranslations, не дает мне покоя этот большой кусок кода на ./prod/server.js. И бонусом надо бы проверить сервер на корректные отправки ошибок, недавно помнится говорил что консоль пишет что-то вроде:
(node:6087) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 3): [object Object]
Может я создам бранч test-backend и там окончательно эти вопросы добью?
@BitDen В этом топике не хватает ряда тестов, например, тестирование поиска по терминам на санскрите и по переводам (а не только по wylie-терминам). Я заставил себя провести небольшой рефакторинг searchTermSpec, код в мастере.
Что делать с GET /api/terms/translation, я не знаю, он слишком специфичен. Создание еще одного слоя, возможно, улучшило бы положение. Это слой между routes и controllers, там такие модули:
Они складываются в ./prod/api и свободно пользуются всеми контроллерами.
С точки зрения server.js выглядит это примерно так:
...
app.post('/api/terms/:id', apiTerms.post)
app.delete('/api/terms/:id', apiTerms.delete)
...
app.get('/api/terms/translation', apiTranslation.get)
Тогда server.js превратится по сути в конфигуратор роутов. А чрезмерная логическая нагрузка на отдельный api-модуль будет не так заметна.
Попробуй это в бранче?
@dhilt Попробую конечно, только в каком бранче, в отдельном или уже существующем каком-либо?
@dhilt Наверное, сначала стоит написать все тесты для actions (вместе с этим похоже последуют изменения на сервере небольшие, в связи с некорректной отправкой ошибок в некоторых местах), и когда код сервера останется в покое, тогда это дело слить с master, и породить бранч crud-refactoring, там и сделать это все. Может так поступим?
@BitDen Я одобряю последовательность из последнего комментария. Вмерж текущий мастер туда, где ты работаешь...
@dhilt Сделал merge - https://github.com/dhilt/dharmadict/commit/7792d0aa6f26ffd0003c6bfc6f4721def2cc28e3. Значит как домучаю тесты для actions, так сразу открою новый бранч и займусь сервером.
@dhilt Вот и первая попытка сделать задуманное - https://github.com/dhilt/dharmadict/commit/fb2782cff55326a38310d9f033cd8dc7b49e0712.
Нужна пачка тестов на GET /api/search. У меня нет конечного видения, только ряд соображений.
Нужно взять testTermTranslation, изменить его так, чтобы переводы содержали бы внятные слова. Поскольку это переводы testTranslator, язык должен быть английским.
А вот testTranslator2 я бы переквалифицировал в русского переводчика.
Далее, нужен второй термин testTerm2. Пусть он будет называться "test term 2". Поиск по строке "test term" должен будет выдать два термина. А поиск по "test 2", только один. Задай testTerm2 русский перевод от testTranslator2.
Прежде чем писать сами тесты, изложи в комментарии план в произвольной форме. Это очень важная спека, не хотелось бы закопаться. Будем последовательны.