@@ -8,6 +8,7 @@ import { find, findAll, currentURL, settled } from '@ember/test-helpers';
88import { setupApplicationTest } from 'ember-qunit' ;
99import { setupMirage } from 'ember-cli-mirage/test-support' ;
1010import { allScenarios } from '../../mirage/scenarios/default' ;
11+ import removeRecord from 'nomad-ui/utils/remove-record' ;
1112
1213import a11yAudit from 'nomad-ui/tests/helpers/a11y-audit' ;
1314import Services from 'nomad-ui/tests/pages/jobs/job/services' ;
@@ -57,4 +58,72 @@ module('Acceptance | job services', function (hooks) {
5758 'Same number of alloc rows as the index shows' ,
5859 ) ;
5960 } ) ;
61+
62+ test ( 'service detail page handles registrations being deleted from under the job' , async function ( assert ) {
63+ const serviceName = find (
64+ '[data-test-service-level="group"][data-test-service-provider="nomad"]' ,
65+ ) . getAttribute ( 'data-test-service-name' ) ;
66+ const initialCount = Number (
67+ find (
68+ '[data-test-service-level="group"][data-test-service-provider="nomad"]' ,
69+ ) . getAttribute ( 'data-test-num-allocs' ) ,
70+ ) ;
71+
72+ await find (
73+ '[data-test-service-level="group"][data-test-service-provider="nomad"] a' ,
74+ ) . click ( ) ;
75+ await settled ( ) ;
76+
77+ assert . strictEqual (
78+ findAll ( 'tr[data-test-service-row]' ) . length ,
79+ initialCount ,
80+ 'detail page renders the expected number of instances' ,
81+ ) ;
82+
83+ // Simulate what reloadRelationship + removeRecord do when `nomad service
84+ // delete` runs on the backend: null out relationships (which removes the
85+ // service from job.services via inverse) and unload the record. The route
86+ // observer should pick up the job.services.length change and refresh.
87+ const store = this . owner . lookup ( 'service:store' ) ;
88+ const toRemove = store
89+ . peekAll ( 'service' )
90+ . find ( ( s ) => s . name === serviceName && s . derivedLevel === 'group' ) ;
91+
92+ if ( toRemove ) {
93+ removeRecord ( store , toRemove ) ;
94+ }
95+
96+ await settled ( ) ;
97+
98+ assert . strictEqual (
99+ findAll ( 'tr[data-test-service-row]' ) . length ,
100+ initialCount - 1 ,
101+ 'detail page updates after a service registration is removed' ,
102+ ) ;
103+ assert . dom ( '.empty-message-headline' ) . doesNotExist ( ) ;
104+ } ) ;
105+
106+ test ( 'service detail page shows empty state when there are no live instances' , async function ( assert ) {
107+ const serviceName = find (
108+ '[data-test-service-level="group"][data-test-service-provider="nomad"]' ,
109+ ) . getAttribute ( 'data-test-service-name' ) ;
110+
111+ // Remove every live registration for this service before navigating in.
112+ const store = this . owner . lookup ( 'service:store' ) ;
113+ store
114+ . peekAll ( 'service' )
115+ . filter ( ( s ) => s . name === serviceName && s . derivedLevel === 'group' )
116+ . forEach ( ( s ) => removeRecord ( store , s ) ) ;
117+ await settled ( ) ;
118+
119+ await find (
120+ '[data-test-service-level="group"][data-test-service-provider="nomad"] a' ,
121+ ) . click ( ) ;
122+ await settled ( ) ;
123+
124+ assert
125+ . dom ( '[data-test-empty-service-instances]' )
126+ . exists ( 'empty state is shown when no live registrations exist' ) ;
127+ assert . dom ( 'tr[data-test-service-row]' ) . doesNotExist ( ) ;
128+ } ) ;
60129} ) ;
0 commit comments