Rework of how services are sorted based on dependencies using a topological sort. Includes error handling to detect circular/self imports (should raise a DependecyError). Added in logging to the CLI to log out any DependencyErrors. Removed the compact module as it is no longer used.
103 lines
2.8 KiB
Python
103 lines
2.8 KiB
Python
from fig.project import sort_service_dicts, DependencyError
|
|
from . import unittest
|
|
|
|
|
|
class SortServiceTest(unittest.TestCase):
|
|
def test_sort_service_dicts_1(self):
|
|
services = [
|
|
{
|
|
'links': ['redis'],
|
|
'name': 'web'
|
|
},
|
|
{
|
|
'name': 'grunt'
|
|
},
|
|
{
|
|
'name': 'redis'
|
|
}
|
|
]
|
|
|
|
sorted_services = sort_service_dicts(services)
|
|
self.assertEqual(len(sorted_services), 3)
|
|
self.assertEqual(sorted_services[0]['name'], 'grunt')
|
|
self.assertEqual(sorted_services[1]['name'], 'redis')
|
|
self.assertEqual(sorted_services[2]['name'], 'web')
|
|
|
|
def test_sort_service_dicts_2(self):
|
|
services = [
|
|
{
|
|
'links': ['redis', 'postgres'],
|
|
'name': 'web'
|
|
},
|
|
{
|
|
'name': 'postgres',
|
|
'links': ['redis']
|
|
},
|
|
{
|
|
'name': 'redis'
|
|
}
|
|
]
|
|
|
|
sorted_services = sort_service_dicts(services)
|
|
self.assertEqual(len(sorted_services), 3)
|
|
self.assertEqual(sorted_services[0]['name'], 'redis')
|
|
self.assertEqual(sorted_services[1]['name'], 'postgres')
|
|
self.assertEqual(sorted_services[2]['name'], 'web')
|
|
|
|
def test_sort_service_dicts_circular_imports(self):
|
|
services = [
|
|
{
|
|
'links': ['redis'],
|
|
'name': 'web'
|
|
},
|
|
{
|
|
'name': 'redis',
|
|
'links': ['web']
|
|
},
|
|
]
|
|
|
|
try:
|
|
sort_service_dicts(services)
|
|
except DependencyError as e:
|
|
self.assertIn('redis', e.msg)
|
|
self.assertIn('web', e.msg)
|
|
else:
|
|
self.fail('Should have thrown an DependencyError')
|
|
|
|
def test_sort_service_dicts_circular_imports_2(self):
|
|
services = [
|
|
{
|
|
'links': ['postgres', 'redis'],
|
|
'name': 'web'
|
|
},
|
|
{
|
|
'name': 'redis',
|
|
'links': ['web']
|
|
},
|
|
{
|
|
'name': 'postgres'
|
|
}
|
|
]
|
|
|
|
try:
|
|
sort_service_dicts(services)
|
|
except DependencyError as e:
|
|
self.assertIn('redis', e.msg)
|
|
self.assertIn('web', e.msg)
|
|
else:
|
|
self.fail('Should have thrown an DependencyError')
|
|
|
|
def test_sort_service_dicts_self_imports(self):
|
|
services = [
|
|
{
|
|
'links': ['web'],
|
|
'name': 'web'
|
|
},
|
|
]
|
|
|
|
try:
|
|
sort_service_dicts(services)
|
|
except DependencyError as e:
|
|
self.assertIn('web', e.msg)
|
|
else:
|
|
self.fail('Should have thrown an DependencyError')
|