Skip to content

Commit

Permalink
Merge d4de37a into 2e28041
Browse files Browse the repository at this point in the history
  • Loading branch information
stephenarosaj authored Oct 15, 2024
2 parents 2e28041 + d4de37a commit 3cfd8ab
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 1 deletion.
5 changes: 5 additions & 0 deletions .changeset/beige-roses-cross.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@firebase/data-connect': patch
---

- Throw error when calling `executeQuery` with mutations
8 changes: 7 additions & 1 deletion packages/data-connect/src/core/QueryManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ import { DataConnectTransport } from '../network';
import { encoderImpl } from '../util/encoder';
import { setIfNotExists } from '../util/map';

import { DataConnectError } from './error';
import { Code, DataConnectError } from './error';

interface TrackedQuery<Data, Variables> {
ref: Omit<OperationRef<Data, Variables>, 'dataConnect'>;
Expand Down Expand Up @@ -172,6 +172,12 @@ export class QueryManager {
executeQuery<Data, Variables>(
queryRef: QueryRef<Data, Variables>
): QueryPromise<Data, Variables> {
if (queryRef.refType !== QUERY_STR) {
throw new DataConnectError(
Code.INVALID_ARGUMENT,
`ExecuteQuery can only execute query operation`
);
}
const key = encoderImpl({
name: queryRef.name,
variables: queryRef.variables,
Expand Down
65 changes: 65 additions & 0 deletions packages/data-connect/test/unit/QueryManager.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
/**
* @license
* Copyright 2024 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

import { deleteApp, FirebaseApp, initializeApp } from '@firebase/app';
import { expect } from 'chai';
import * as chai from 'chai';
import chaiAsPromised from 'chai-as-promised';

import {
DataConnect,
executeQuery,
getDataConnect,
mutationRef,
queryRef
} from '../../src';
import { Code, DataConnectError } from '../../src/core/error';
chai.use(chaiAsPromised);

describe('Query Manager Tests', () => {
let dc: DataConnect;
let app: FirebaseApp;
const APPID = 'MYAPPID';
const APPNAME = 'MYAPPNAME';

beforeEach(() => {
app = initializeApp({ projectId: 'p', appId: APPID }, APPNAME);
dc = getDataConnect(app, {
connector: 'c',
location: 'l',
service: 's'
});
});
afterEach(async () => {
await dc._delete();
await deleteApp(app);
});

it('should refuse to make requests to execute non-query operations', async () => {
const query = queryRef<string>(dc, 'q');
const mutation = mutationRef<string>(dc, 'm');

const error = new DataConnectError(
Code.INVALID_ARGUMENT,
`ExecuteQuery can only execute query operation`
);

// @ts-ignore
expect(() => executeQuery(mutation)).to.throw(error.message);
expect(() => executeQuery(query)).to.not.throw(error.message);
});
});

0 comments on commit 3cfd8ab

Please sign in to comment.