Тестирование триггеров для полнотекстового поиска в Django - PullRequest
0 голосов
/ 03 марта 2019

Я добавляю поисковую систему в проект Django и, таким образом, настраиваю SearchVectorFields на нескольких моделях с пользовательскими триггерами.

Я хотел бы провести модульное тестирование того, что мои столбцы типа TSVECTORобновляется при изменении экземпляра модели.

Однако мне не удалось найти никакой информации о том, как проверить содержимое SearchVectorField ... Я не могу сравнить my_document.search с SearchVector(Value("document content"))или похожий, потому что первый кажется строковым, а последний - объектом.

TL; DR

Точнее, с моделью:

from django.db import models

class Document(models.Model):
    ...
    content = TextField()
    search = SearchVectorField()

и триггер:

-- create trigger function
CREATE OR REPLACE FUNCTION search_trigger() RETURNS trigger AS $$
begin
    NEW.search := to_tsvector(COALESCE(NEW.content, ''))
    return NEW;
end
$$ LANGUAGE plpgsql;
-- add trigger on insert
DROP TRIGGER IF EXISTS search_trigger ON myapp_document;
CREATE TRIGGER search_trigger
BEFORE INSERT
ON myapp_document
FOR EACH ROW
EXECUTE PROCEDURE search_trigger();
-- add trigger on update
DROP TRIGGER IF EXISTS search_trigger_update ON myapp_document;
CREATE TRIGGER search_trigger_update
BEFORE UPDATE OF content
ON myapp_document
FOR EACH ROW
WHEN (OLD.content IS DISTINCT FROM NEW.content)
EXECUTE PROCEDURE search_trigger();

Как проверить, что при создании нового экземпляра Document его поле search заполняется правильными значениями ?Тот же вопрос для обновления существующего экземпляра Document, но ответ должен быть довольно похожим.

Спасибо за любую подсказку;)

1 Ответ

0 голосов
/ 04 марта 2019

Я думаю, вы можете сравнить строковое представление ваших значений SearchVectorField:

from django.test import TestCase

from .models import Document


class DocumentTest(TestCase):

    def setUp(self):
        Document.objects.create(content='Pizza Recipes')

    def test_document_search(self):
        document_list = list(Document.objects.values_list('search', flat=True))
        search_list = ["'pizza':1 'recip':2"]
        self.assertSequenceEqual(document_list, search_list)
...