2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-07-13 08:21:26 +00:00

Add Metadata to more models (#4898)

* Update models: add MetadataMixin

* Fix name of model in Metadata API definition

* Add API endpoints

* Update API version

* Fix syntax

* Add API endpoint for RO, RO line, RO line extra item

* Add Metadata to Contacts

* Fix link in API version

* Fix name of model

* Fix error?

* Fix error?

* Fix all errors, hopefully..

* Add tests for order, line, extraline metadata

Extend for PO, SO

* Add tests for metadata for Company-related models

* Fix spelling

* Consolidate metadata test for all part models into one test

* Add test for all Stock metadata

* Update stock test_api

* Add all metadata tests for orders

* Fix various errors in tests

* Fix model name

* Add migration files

* Update tests for metadata

* Resolve conflict around API version number

* Rename migration file

* Rename migration file

* Will Contact edit endpoint work better?

* Revert changes in URL definitions

* Remove test, duplicate

* Fix tests with fixed PK, not from fixtures, to use a dynamic PK

* Fix migration overlap
This commit is contained in:
miggland
2023-06-02 11:26:20 +02:00
committed by GitHub
parent c0dafe155f
commit 1d85b70313
21 changed files with 462 additions and 136 deletions

View File

@ -6,7 +6,7 @@ from rest_framework import status
from InvenTree.unit_test import InvenTreeAPITestCase
from .models import Company, Contact, SupplierPart
from .models import Company, Contact, ManufacturerPart, SupplierPart
class CompanyTest(InvenTreeAPITestCase):
@ -233,7 +233,10 @@ class ContactTest(InvenTreeAPITestCase):
def test_edit(self):
"""Test that we can edit a Contact via the API"""
url = reverse('api-contact-detail', kwargs={'pk': 1})
# Get the first contact
contact = Contact.objects.first()
# Use this contact in the tests
url = reverse('api-contact-detail', kwargs={'pk': contact.pk})
# Retrieve detail view
data = self.get(url, expected_code=200).data
@ -259,13 +262,16 @@ class ContactTest(InvenTreeAPITestCase):
expected_code=200
)
contact = Contact.objects.get(pk=1)
# Get the contact again
contact = Contact.objects.first()
self.assertEqual(contact.role, 'x')
def test_delete(self):
"""Tests that we can delete a Contact via the API"""
url = reverse('api-contact-detail', kwargs={'pk': 6})
# Get the last contact
contact = Contact.objects.first()
url = reverse('api-contact-detail', kwargs={'pk': contact.pk})
# Delete (without required permissions)
self.delete(url, expected_code=403)
@ -490,3 +496,63 @@ class SupplierPartTest(InvenTreeAPITestCase):
sp = SupplierPart.objects.get(pk=response.data['pk'])
self.assertEqual(sp.available, 999)
self.assertIsNotNone(sp.availability_updated)
class CompanyMetadataAPITest(InvenTreeAPITestCase):
"""Unit tests for the various metadata endpoints of API."""
fixtures = [
'category',
'part',
'location',
'company',
'contact',
'manufacturer_part',
'supplier_part',
]
roles = [
'company.change',
'purchase_order.change',
'part.change',
]
def metatester(self, apikey, model):
"""Generic tester"""
modeldata = model.objects.first()
# Useless test unless a model object is found
self.assertIsNotNone(modeldata)
url = reverse(apikey, kwargs={'pk': modeldata.pk})
# Metadata is initially null
self.assertIsNone(modeldata.metadata)
numstr = f'12{len(apikey)}'
self.patch(
url,
{
'metadata': {
f'abc-{numstr}': f'xyz-{apikey}-{numstr}',
}
},
expected_code=200
)
# Refresh
modeldata.refresh_from_db()
self.assertEqual(modeldata.get_metadata(f'abc-{numstr}'), f'xyz-{apikey}-{numstr}')
def test_metadata(self):
"""Test all endpoints"""
for apikey, model in {
'api-manufacturer-part-metadata': ManufacturerPart,
'api-supplier-part-metadata': SupplierPart,
'api-company-metadata': Company,
'api-contact-metadata': Contact,
}.items():
self.metatester(apikey, model)