From 0b48234c83988d4ca8394037bd9293c0cf24e417 Mon Sep 17 00:00:00 2001 From: Daniel Bright Date: Fri, 23 Aug 2024 10:42:05 -0700 Subject: [PATCH] add explain postgres data connectors setting --- .../explain-data-connector-details.ts | 36 ++++++++++++++++ packages/cli/src/lib/pg/types.ts | 1 + ...xplain-data-connector-details.unit.test.ts | 43 +++++++++++++++++++ 3 files changed, 80 insertions(+) create mode 100644 packages/cli/src/commands/pg/settings/explain-data-connector-details.ts create mode 100644 packages/cli/test/unit/commands/pg/settings/explain-data-connector-details.unit.test.ts diff --git a/packages/cli/src/commands/pg/settings/explain-data-connector-details.ts b/packages/cli/src/commands/pg/settings/explain-data-connector-details.ts new file mode 100644 index 0000000000..95fc8730f0 --- /dev/null +++ b/packages/cli/src/commands/pg/settings/explain-data-connector-details.ts @@ -0,0 +1,36 @@ +import {flags} from '@heroku-cli/command' +import {Args} from '@oclif/core' +import heredoc from 'tsheredoc' +import {type BooleanAsString, booleanConverter, PGSettingsCommand} from '../../../lib/pg/setter' +import type {Setting, SettingKey} from '../../../lib/pg/types' + +export default class ExplainDataConnectorDetails extends PGSettingsCommand { + static topic = 'pg' + static description = heredoc(` + Displays stats on replication slots on your database. The default value is "off". + `) + + static flags = { + app: flags.app({required: true}), + remote: flags.remote(), + } + + static args = { + database: Args.string(), + value: Args.string(), + } + + protected settingKey:SettingKey = 'explain_data_connector_details' + + protected convertValue(val: BooleanAsString): boolean { + return booleanConverter(val) + } + + protected explain(setting: Setting): string { + if (setting?.value) { + return 'Data replication slot details will be logged.' + } + + return 'Data replication slot details will no longer be logged.' + } +} diff --git a/packages/cli/src/lib/pg/types.ts b/packages/cli/src/lib/pg/types.ts index 3c356f311d..02c67b5538 100644 --- a/packages/cli/src/lib/pg/types.ts +++ b/packages/cli/src/lib/pg/types.ts @@ -215,6 +215,7 @@ export type SettingKey = | 'pgbouncer_max_client_conn' | 'pg_bouncer_max_db_conns' | 'pg_bouncer_default_pool_size' + | 'explain_data_connector_details' | 'auto_explain' | 'auto_explain.log_min_duration' | 'auto_explain.log_analyze' diff --git a/packages/cli/test/unit/commands/pg/settings/explain-data-connector-details.unit.test.ts b/packages/cli/test/unit/commands/pg/settings/explain-data-connector-details.unit.test.ts new file mode 100644 index 0000000000..eddf84dfe9 --- /dev/null +++ b/packages/cli/test/unit/commands/pg/settings/explain-data-connector-details.unit.test.ts @@ -0,0 +1,43 @@ +import {expect} from '@oclif/test' +import * as nock from 'nock' +import {stdout} from 'stdout-stderr' +import heredoc from 'tsheredoc' +import runCommand from '../../../../helpers/runCommand' +import Cmd from '../../../../../src/commands/pg/settings/explain-data-connector-details' +import * as fixtures from '../../../../fixtures/addons/fixtures' + +describe('pg:explain-data-connector-details', function () { + const addon = fixtures.addons['dwh-db'] + + beforeEach(function () { + nock('https://api.heroku.com') + .post('/actions/addons/resolve', { + app: 'myapp', + addon: 'test-database', + }).reply(200, [addon]) + }) + + afterEach(function () { + nock.cleanAll() + }) + + it('turns on explain-data-connector-details option', async function () { + nock('https://api.data.heroku.com') + .get(`/postgres/v0/databases/${addon.id}/config`).reply(200, {explain_data_connector_details: {value: 'on'}}) + await runCommand(Cmd, ['--app', 'myapp', 'test-database']) + expect(stdout.output).to.equal(heredoc(` + explain-data-connector-details is set to on for ${addon.name}. + Data replication slot details will be logged. + `)) + }) + + it('turns off explain-data-connector-details option', async function () { + nock('https://api.data.heroku.com') + .get(`/postgres/v0/databases/${addon.id}/config`).reply(200, {explain_data_connector_details: {value: ''}}) + await runCommand(Cmd, ['--app', 'myapp', 'test-database']) + expect(stdout.output).to.equal(heredoc(` + explain-data-connector-details is set to for ${addon.name}. + Data replication slot details will no longer be logged. + `)) + }) +})