- 3 anomaly types: behind_schedule, ahead_of_schedule, low_utilization - 3 severity levels: low, medium, high - expected / actual / variance_pct (mirrors anomaly_detection service output) - 4-state lifecycle: new -> acknowledged -> resolved (or dismissed) - action_acknowledge / action_dismiss / action_resolve transitions - ondelete='cascade' on asset_id (anomalies follow the asset) - 4 new tests (63 total) Made-with: Cursor
50 lines
1.5 KiB
Python
50 lines
1.5 KiB
Python
from datetime import date
|
|
|
|
from odoo.tests.common import TransactionCase
|
|
from odoo.tests import tagged
|
|
|
|
|
|
@tagged('post_install', '-at_install')
|
|
class TestFusionAssetAnomaly(TransactionCase):
|
|
|
|
def setUp(self):
|
|
super().setUp()
|
|
self.asset = self.env['fusion.asset'].create({
|
|
'name': 'Watched Asset',
|
|
'cost': 5000,
|
|
'acquisition_date': date(2026, 1, 1),
|
|
})
|
|
|
|
def _make_anomaly(self, **kw):
|
|
vals = {
|
|
'asset_id': self.asset.id,
|
|
'anomaly_type': 'behind_schedule',
|
|
'severity': 'medium',
|
|
'expected': 1000.0,
|
|
'actual': 700.0,
|
|
'variance_pct': -30.0,
|
|
}
|
|
vals.update(kw)
|
|
return self.env['fusion.asset.anomaly'].create(vals)
|
|
|
|
def test_create_defaults_state_new(self):
|
|
a = self._make_anomaly()
|
|
self.assertEqual(a.state, 'new')
|
|
self.assertTrue(a.detected_at)
|
|
self.assertEqual(a.company_id, self.asset.company_id)
|
|
|
|
def test_acknowledge_transitions(self):
|
|
a = self._make_anomaly()
|
|
a.action_acknowledge()
|
|
self.assertEqual(a.state, 'acknowledged')
|
|
|
|
def test_dismiss_transitions(self):
|
|
a = self._make_anomaly()
|
|
a.action_dismiss()
|
|
self.assertEqual(a.state, 'dismissed')
|
|
|
|
def test_resolve_transitions(self):
|
|
a = self._make_anomaly(anomaly_type='low_utilization', severity='high')
|
|
a.action_resolve()
|
|
self.assertEqual(a.state, 'resolved')
|