Use flow-model in gr-create-flow

Bug: Google b/431939712
Release-Notes: skip
Change-Id: I9c962a6a37f4745d41685afeca4c0757c82c5dcc
diff --git a/polygerrit-ui/app/elements/change/gr-flows/gr-create-flow.ts b/polygerrit-ui/app/elements/change/gr-flows/gr-create-flow.ts
index d2656d0..f152806 100644
--- a/polygerrit-ui/app/elements/change/gr-flows/gr-create-flow.ts
+++ b/polygerrit-ui/app/elements/change/gr-flows/gr-create-flow.ts
@@ -18,6 +18,7 @@
 import {MdOutlinedTextField} from '@material/web/textfield/outlined-text-field';
 import {resolve} from '../../../models/dependency';
 import {configModelToken} from '../../../models/config/config-model';
+import {flowsModelToken} from '../../../models/flows/flows-model';
 import {subscribe} from '../../lit/subscription-controller';
 import {throwingErrorCallback} from '../../shared/gr-rest-api-interface/gr-rest-apis/gr-rest-api-helper';
 import {
@@ -60,6 +61,8 @@
 
   private readonly getConfigModel = resolve(this, configModelToken);
 
+  private readonly getFlowsModel = resolve(this, flowsModelToken);
+
   private readonly projectSuggestions: SuggestionProvider = (
     predicate,
     expression
@@ -347,17 +350,12 @@
         return {condition: stage.condition};
       }),
     };
-    await this.restApiService.createFlow(this.changeNum, flowInput, e => {
-      console.error(e);
-    });
+    await this.getFlowsModel().createFlow(flowInput);
     this.stages = [];
     this.currentCondition = '';
     this.currentAction = '';
     this.currentParameter = '';
     this.loading = false;
-    this.dispatchEvent(
-      new CustomEvent('flow-created', {bubbles: true, composed: true})
-    );
   }
 }
 
diff --git a/polygerrit-ui/app/elements/change/gr-flows/gr-create-flow_test.ts b/polygerrit-ui/app/elements/change/gr-flows/gr-create-flow_test.ts
index 1640709..ac71093 100644
--- a/polygerrit-ui/app/elements/change/gr-flows/gr-create-flow_test.ts
+++ b/polygerrit-ui/app/elements/change/gr-flows/gr-create-flow_test.ts
@@ -7,21 +7,20 @@
 import './gr-create-flow';
 import {assert, fixture, html} from '@open-wc/testing';
 import {GrCreateFlow} from './gr-create-flow';
-import {
-  mockPromise,
-  queryAll,
-  queryAndAssert,
-  stubRestApi,
-} from '../../../test/test-utils';
+import {queryAll, queryAndAssert} from '../../../test/test-utils';
 import {NumericChangeId} from '../../../types/common';
 import {GrButton} from '../../shared/gr-button/gr-button';
 import {MdOutlinedTextField} from '@material/web/textfield/outlined-text-field';
 import {GrSearchAutocomplete} from '../../core/gr-search-autocomplete/gr-search-autocomplete';
+import {FlowsModel, flowsModelToken} from '../../../models/flows/flows-model';
+import {testResolver} from '../../../test/common-test-setup';
 
 suite('gr-create-flow tests', () => {
   let element: GrCreateFlow;
+  let flowsModel: FlowsModel;
 
   setup(async () => {
+    flowsModel = testResolver(flowsModelToken);
     element = await fixture<GrCreateFlow>(
       html`<gr-create-flow></gr-create-flow>`
     );
@@ -122,7 +121,7 @@
   });
 
   test('creates a flow with one stage', async () => {
-    const createFlowStub = stubRestApi('createFlow').returns(mockPromise());
+    const createFlowStub = sinon.stub(flowsModel, 'createFlow');
 
     const searchAutocomplete = queryAndAssert<GrSearchAutocomplete>(
       element,
@@ -146,7 +145,7 @@
     await element.updateComplete;
 
     assert.isTrue(createFlowStub.calledOnce);
-    const flowInput = createFlowStub.lastCall.args[1];
+    const flowInput = createFlowStub.lastCall.args[0];
     assert.deepEqual(flowInput.stage_expressions, [
       {
         condition:
@@ -157,7 +156,7 @@
   });
 
   test('creates a flow with parameters', async () => {
-    const createFlowStub = stubRestApi('createFlow').returns(mockPromise());
+    const createFlowStub = sinon.stub(flowsModel, 'createFlow');
 
     const searchAutocomplete = queryAndAssert<GrSearchAutocomplete>(
       element,
@@ -188,7 +187,7 @@
     await element.updateComplete;
 
     assert.isTrue(createFlowStub.calledOnce);
-    const flowInput = createFlowStub.lastCall.args[1];
+    const flowInput = createFlowStub.lastCall.args[0];
     assert.deepEqual(flowInput.stage_expressions, [
       {
         condition:
@@ -199,7 +198,7 @@
   });
 
   test('creates a flow with multiple stages', async () => {
-    const createFlowStub = stubRestApi('createFlow').returns(mockPromise());
+    const createFlowStub = sinon.stub(flowsModel, 'createFlow');
 
     const searchAutocomplete = queryAndAssert<GrSearchAutocomplete>(
       element,
@@ -238,7 +237,7 @@
     await element.updateComplete;
 
     assert.isTrue(createFlowStub.calledOnce);
-    const flowInput = createFlowStub.lastCall.args[1];
+    const flowInput = createFlowStub.lastCall.args[0];
     assert.deepEqual(flowInput.stage_expressions, [
       {
         condition:
@@ -254,7 +253,7 @@
   });
 
   test('create flow with added stages and current input', async () => {
-    const createFlowStub = stubRestApi('createFlow').returns(mockPromise());
+    const createFlowStub = sinon.stub(flowsModel, 'createFlow');
 
     const searchAutocomplete = queryAndAssert<GrSearchAutocomplete>(
       element,
@@ -290,7 +289,7 @@
     await element.updateComplete;
 
     assert.isTrue(createFlowStub.calledOnce);
-    const flowInput = createFlowStub.lastCall.args[1];
+    const flowInput = createFlowStub.lastCall.args[0];
     assert.deepEqual(flowInput.stage_expressions, [
       {
         condition:
diff --git a/polygerrit-ui/app/elements/change/gr-flows/gr-flows.ts b/polygerrit-ui/app/elements/change/gr-flows/gr-flows.ts
index f2f93d0..e272eda 100644
--- a/polygerrit-ui/app/elements/change/gr-flows/gr-flows.ts
+++ b/polygerrit-ui/app/elements/change/gr-flows/gr-flows.ts
@@ -173,10 +173,7 @@
     return html`
       <div class="container">
         <h2 class="main-heading">Create new flow</h2>
-        <gr-create-flow
-          .changeNum=${this.changeNum}
-          @flow-created=${() => this.getFlowsModel().reload()}
-        ></gr-create-flow>
+        <gr-create-flow .changeNum=${this.changeNum}></gr-create-flow>
         <hr />
         ${this.renderFlowsList()}
       </div>
diff --git a/polygerrit-ui/app/elements/change/gr-flows/gr-flows_test.ts b/polygerrit-ui/app/elements/change/gr-flows/gr-flows_test.ts
index 212bf1d..b21b090 100644
--- a/polygerrit-ui/app/elements/change/gr-flows/gr-flows_test.ts
+++ b/polygerrit-ui/app/elements/change/gr-flows/gr-flows_test.ts
@@ -10,7 +10,6 @@
 import {FlowInfo, FlowStageState, Timestamp} from '../../../api/rest-api';
 import {queryAndAssert} from '../../../test/test-utils';
 import {NumericChangeId} from '../../../types/common';
-import {GrCreateFlow} from './gr-create-flow';
 import sinon from 'sinon';
 import {GrButton} from '../../shared/gr-button/gr-button';
 import {GrDialog} from '../../shared/gr-dialog/gr-dialog';
@@ -308,20 +307,6 @@
     assert.isFalse(dialog.open);
   });
 
-  test('reloads flows on flow-created event', async () => {
-    const reloadStub = flowsModel.reload as sinon.SinonStub;
-    reloadStub.resetHistory();
-
-    const createFlow = queryAndAssert<GrCreateFlow>(element, 'gr-create-flow');
-    createFlow.dispatchEvent(
-      new CustomEvent('flow-created', {bubbles: true, composed: true})
-    );
-
-    await element.updateComplete;
-
-    assert.isTrue(reloadStub.calledOnce);
-  });
-
   test('refreshes flows on button click', async () => {
     const flow = {
       uuid: 'flow1',
diff --git a/polygerrit-ui/app/models/flows/flows-model.ts b/polygerrit-ui/app/models/flows/flows-model.ts
index 31ecd58..70f0661 100644
--- a/polygerrit-ui/app/models/flows/flows-model.ts
+++ b/polygerrit-ui/app/models/flows/flows-model.ts
@@ -6,7 +6,7 @@
 import {BehaviorSubject, combineLatest, from, of} from 'rxjs';
 import {catchError, map, switchMap} from 'rxjs/operators';
 import {ChangeModel} from '../change/change-model';
-import {FlowInfo} from '../../api/rest-api';
+import {FlowInfo, FlowInput} from '../../api/rest-api';
 import {Model} from '../base/model';
 import {define} from '../dependency';
 
@@ -81,4 +81,10 @@
     await this.restApiService.deleteFlow(this.changeNum, flowId);
     this.reload();
   }
+
+  async createFlow(flowInput: FlowInput) {
+    if (!this.changeNum) return;
+    await this.restApiService.createFlow(this.changeNum, flowInput);
+    this.reload();
+  }
 }