CI/CD Django и Postgress: сбой в тестах в моделях, использующих сигналы
Я пытаюсь настроить CI/CD на Github с моим проектом Django.
Я обнаружил несколько необычных проблем. Некоторые из моих тестов, которые прекрасно работают на локальном сервере, не работают на CI/CD. Проблема с моделью, которая посылает сигнал другой модели для создания нового объекта. На локальном сервере у меня 8 сигналов, тесты работают, а в CI/CD только один. Остальные тесты проходят без проблем.
Возможно, кто-то может помочь мне с этим вопросом.
Мой .yml файл
name: CI/CD Django, Postgress
on: [ push ]
jobs:
build:
runs-on: ubuntu-latest
services:
postgres:
image: postgres:12.5
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: github-actions
ports:
- 5432:5432
options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up Python 3.10
uses: actions/setup-python@v2
with:
python-version: "3.10"
- name: Install Requirements
run: |
pip install -r requirements.txt
- name: Run migration
env:
DEBUG: "0"
SECRET_KEY: CD_CI_TEST_KEY
USER: postgres
PASSWORD: postgres
NAME: github-actions
HOST: localhost
PORT: 5432
run: |
python manage.py migrate
- name: Run tests
env:
DEBUG: "0"
SECRET_KEY: CD_CI_TEST_KEY
USER: postgres
PASSWORD: postgres
NAME: github-actions
HOST: localhost
PORT: 5432
run: |
python manage.py test
Модели
class Chat(models.Model):
post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='post')
owner = models.ForeignKey(User, on_delete=models.RESTRICT, related_name='owner')
customer = models.ForeignKey(User, on_delete=models.RESTRICT, related_name='customer')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
last_message = models.TextField(null=True, blank=True)
class Message(models.Model):
chat = models.ForeignKey(Chat, on_delete=models.CASCADE, related_name='chat')
message = models.TextField()
sender = models.ForeignKey(User, on_delete=models.RESTRICT, related_name='sender')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
# Hooks a signal from Chat model and create a new message in Message model
@receiver(post_save, sender=Chat)
def save_chat(sender, instance, **kwargs):
if instance.last_message:
Message.objects.create(
chat_id=instance.id,
message=instance.last_message,
sender_id=instance.customer_id,
updated_at=instance.updated_at
)
# Hooks a signal from Message and update the last_message field in Chat model
@receiver(post_save, sender=Message)
def save_chat(instance, created, **kwargs):
if created:
Chat.objects.filter(id=instance.chat_id).update(
last_message=instance.message,
updated_at=instance.updated_at
)