pytest-django
pytest-django copied to clipboard
Test works locally but fails when ran on Travis-CI
trafficstars
Please for some reason one of my test is failing on Travis CI but passes locally.
This is the code for the test:
@pytest.mark.django_db(transaction=True)
class TestCreateItem:
def test_successful_item_creation(self, client, seller_token):
"""
Test for successful item creation
GIVEN: A seller enters name, price, image and description of items
WHEN: The seller submits the form
THEN: They should get a success response of status code 201, A message that says 'Item has been created successfully'
"""
with open('tests/test_item/0_U8TbUaajSO7rXk1j.jpg', 'rb') as image:
data = {
"name": "An Item",
"price": 15000.55,
"description": "This is a random item",
"image": image
}
response = client.post("/items/create_item", data=data, **seller_token)
response_data = response.json()
print(response_data)
assert response.status_code == 201
assert response_data["message"] == "Item has been created successfully"
When I run the test locally, it passes, but when it is ran on Travis CI it fails without any descriptive information as to what went wrong. Below is a snippet of the error:
tests/test_item/test_fetch_item_queryset.py .... [ 21%]
tests/test_seller/test_seller_authentication.py ........ [ 63%]
tests/test_item/test_create_item.py F...... [100%]
=================================== FAILURES ===================================
_________________ TestCreateItem.test_successful_item_creation _________________
self = CreateItemSerializer(data=<QueryDict: {'name': ['An Item'], 'price': ['15000.55'], 'description': ['This is a random i...digits=10)
image = ImageField(max_length=100)
description = CharField(style={'base_template': 'textarea.html'})
validated_data = {'description': 'This is a random item', 'image': <InMemoryUploadedFile: 0_U8TbUaajSO7rXk1j.jpg (image/jpeg)>, 'name': 'An Item', 'price': Decimal('15000.55'), ...}
def create(self, validated_data):
"""
We have a bit of extra checking around this in order to provide
descriptive messages when something goes wrong, but this method is
essentially just:
return ExampleModel.objects.create(**validated_data)
If there are many to many fields present on the instance then they
cannot be set until the model is instantiated, in which case the
implementation is like so:
example_relationship = validated_data.pop('example_relationship')
instance = ExampleModel.objects.create(**validated_data)
instance.example_relationship = example_relationship
return instance
The default implementation also does not handle nested relationships.
If you want to support writable nested relationships you'll need
to write an explicit `.create()` method.
"""
raise_errors_on_nested_writes('create', self, validated_data)
ModelClass = self.Meta.model
# Remove many-to-many relationships from validated_data.
# They are not valid arguments to the default `.create()` method,
# as they require that the instance has already been saved.
info = model_meta.get_field_info(ModelClass)
many_to_many = {}
for field_name, relation_info in info.relations.items():
if relation_info.to_many and (field_name in validated_data):
many_to_many[field_name] = validated_data.pop(field_name)
try:
> instance = ModelClass._default_manager.create(**validated_data)
../../../virtualenv/python3.9.12/lib/python3.9/site-packages/rest_framework/serializers.py:939:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <django.db.models.manager.Manager object at 0x7f6e234c47f0>, args = ()
kwargs = {'description': 'This is a random item', 'image': <InMemoryUploadedFile: 0_U8TbUaajSO7rXk1j.jpg (image/jpeg)>, 'name': 'An Item', 'price': Decimal('15000.55'), ...}
def manager_method(self, *args, **kwargs):
> return getattr(self.get_queryset(), name)(*args, **kwargs)
../../../virtualenv/python3.9.12/lib/python3.9/site-packages/django/db/models/manager.py:85:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <QuerySet []>
kwargs = {'description': 'This is a random item', 'image': <InMemoryUploadedFile: 0_U8TbUaajSO7rXk1j.jpg (image/jpeg)>, 'name': 'An Item', 'price': Decimal('15000.55'), ...}
obj = <Items: [email protected] An Item>
def create(self, **kwargs):
"""
Create a new object with the given kwargs, saving it to the database
and returning the created object.
"""
obj = self.model(**kwargs)
self._for_write = True
> obj.save(force_insert=True, using=self.db)
I would appreciate any pointers as to what the problem is