dhilt / dharmadict

MIT License
1 stars 2 forks source link

API search tests #19

Closed dhilt closed 6 years ago

dhilt commented 7 years ago

Нужна пачка тестов на GET /api/search. У меня нет конечного видения, только ряд соображений.

Нужно взять testTermTranslation, изменить его так, чтобы переводы содержали бы внятные слова. Поскольку это переводы testTranslator, язык должен быть английским.

А вот testTranslator2 я бы переквалифицировал в русского переводчика.

Далее, нужен второй термин testTerm2. Пусть он будет называться "test term 2". Поиск по строке "test term" должен будет выдать два термина. А поиск по "test 2", только один. Задай testTerm2 русский перевод от testTranslator2.

Прежде чем писать сами тесты, изложи в комментарии план в произвольной форме. Это очень важная спека, не хотелось бы закопаться. Будем последовательны.

dyuvzhenko commented 7 years ago

@dhilt Как я это вижу по пунктам:

  1. Проверяем есть ли такой запрос и откликается ли на него сервер (ждем ответа 200)

  2. Сначала ищем несуществующий термин - в ответ должно прийти вроде {success: true, result: []}

  3. Задаем поиск в виде строки "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, также проверяем все ли поля на месте, и сделаны ли переводы двумя тестовыми переводчиками.

  4. Затем в поиске участвует строка "test term 2" и мы ожидаем всего один термин. И также смотрим все ли поля на месте, вcе ли соответствует testTerm2 и testTranslation2, два ли там переводчика и их ли это переводы в точности как описано _shared.js.

Вот как-то так наверное. Но перед этим тестом надо будет собственно додумать создание двух терминов, двух разноязычных переводчиков, более-менее адекватные переводы и еще может что-то всплывет. Буду пробовать в общем.

dyuvzhenko commented 7 years ago

@dhilt Пока что вижу несостыковку в виде полей sanskrit_rus, sanskrit_rus_lower, sanskrit_eng, sanskrit_eng_lower. У всех давних терминов эти поля присутствуют, но наш клиент и метод на сервере termsController.create() построены так, что эти поля вовсе не требуются. Наверное мы этот момент упустили и его надо дописывать.

dhilt commented 7 years ago

@BitDen Хорошее замечание! Прошу: https://github.com/dhilt/dharmadict/issues/20.

dhilt commented 7 years ago

@BitDen Я согласен с твоим планом, но это только начало! дальше нужно будет тестировать собственно переводы, translations-meanings. Но пока, на первой итерации давай ограничимся самими терминами.

dyuvzhenko commented 7 years ago

@dhilt Нуу... В общем я это сообщение прочитал только сейчас, и уже написал тесты также на translations-meanings. Вот коммит: https://github.com/dhilt/dharmadict/commit/05ae62f8411fe21fbe8d3334df7fdc33a39966c0

Дополнительно заметил что каждый translations от каждого автора должен содержать в объекте данных 'language'. Также убрал лишний id, который в лишний раз записывался в '_source' - у старых терминов не было подобного, вот и убрал. А id у самого документа в базе данных остается, с этим порядок, там есть переменная termId. Коммит: https://github.com/dhilt/dharmadict/commit/6249c2aa0b60cc3db5d1e7187201e8e88e7d1f20

dyuvzhenko commented 7 years ago

Так полностью выглядит '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"
            }
          ]
        }
      }
dhilt commented 7 years ago

@BitDen Я очень хочу посмотреть это, но уже не могу... посмотри пока, что можно сдедать с интернационализацией. Соображения можно излагать в отдельной задаче. Если будет напрашиваться код, тоже пробуй в отдельном бранче. // Я выложил dev-бранч в production, кстати.

dyuvzhenko commented 7 years ago

@dhilt Очень избыточно там понаписал, сейчас попробую подрефакторить тот код на searchTermSpec.js. Пока не подправлю, лучше туда правда не смотреть.

dyuvzhenko commented 7 years ago

@dhilt Пока что убрал три огромных по своему смыслу одинаковых куска кода (который шел вглубь проверять "translations") и сделал одну функцию для этой проверки. Коммит: https://github.com/dhilt/dharmadict/commit/00669a12af1d42d1b6f495f5ee8d4a5bff1604e2 Наверное, больше не стоит другие данные заталкивать в новую функцию testTranslationsInTerm.

dyuvzhenko commented 7 years ago

@dhilt И следом добавил проверку на поля с санскритом - https://github.com/dhilt/dharmadict/commit/8ca6624278badda8a692c5db4d231455dc65d20e. И маленькая косметическая поправка + один нужный assert.equal: https://github.com/dhilt/dharmadict/commit/587a28146cf757f7a24ad8f4de65c811f607b278

dyuvzhenko commented 7 years ago

@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
dyuvzhenko commented 6 years ago

@dhilt А что с этим issue, можно его уже считать закрытым или тут остались еще какие-то вопросы? Я заметил вот, что у нас не хватает тестов для /api/terms/translation - нужно написать. И плюс хочется немного переписать метод findTranslations, не дает мне покоя этот большой кусок кода на ./prod/server.js. И бонусом надо бы проверить сервер на корректные отправки ошибок, недавно помнится говорил что консоль пишет что-то вроде:

(node:6087) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 3): [object Object]

Может я создам бранч test-backend и там окончательно эти вопросы добью?

dhilt commented 6 years ago

@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-модуль будет не так заметна.

Попробуй это в бранче?

dyuvzhenko commented 6 years ago

@dhilt Попробую конечно, только в каком бранче, в отдельном или уже существующем каком-либо?

dyuvzhenko commented 6 years ago

@dhilt Наверное, сначала стоит написать все тесты для actions (вместе с этим похоже последуют изменения на сервере небольшие, в связи с некорректной отправкой ошибок в некоторых местах), и когда код сервера останется в покое, тогда это дело слить с master, и породить бранч crud-refactoring, там и сделать это все. Может так поступим?

dhilt commented 6 years ago

@BitDen Я одобряю последовательность из последнего комментария. Вмерж текущий мастер туда, где ты работаешь...

dyuvzhenko commented 6 years ago

@dhilt Сделал merge - https://github.com/dhilt/dharmadict/commit/7792d0aa6f26ffd0003c6bfc6f4721def2cc28e3. Значит как домучаю тесты для actions, так сразу открою новый бранч и займусь сервером.

dyuvzhenko commented 6 years ago

@dhilt Вот и первая попытка сделать задуманное - https://github.com/dhilt/dharmadict/commit/fb2782cff55326a38310d9f033cd8dc7b49e0712.