Skip to content

Commit 6ed203e

Browse files
authored
fix(metric-alerts): Ensure that changing project in create alert page is saved correctly (#54052)
1 parent d9811da commit 6ed203e

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

static/app/views/alerts/rules/metric/ruleForm.spec.tsx

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {initializeOrg} from 'sentry-test/initializeOrg';
44
import {act, render, screen, userEvent, waitFor} from 'sentry-test/reactTestingLibrary';
55

66
import {addErrorMessage} from 'sentry/actionCreators/indicator';
7+
import ProjectsStore from 'sentry/stores/projectsStore';
78
import {metric} from 'sentry/utils/analytics';
89
import RuleFormContainer from 'sentry/views/alerts/rules/metric/ruleForm';
910
import {permissionAlertText} from 'sentry/views/settings/project/permissionAlert';
@@ -38,6 +39,7 @@ describe('Incident Rules Form', () => {
3839
});
3940
organization = initialData.organization;
4041
project = initialData.project;
42+
ProjectsStore.loadInitialData([project]);
4143
routerContext = initialData.routerContext;
4244
MockApiClient.addMockResponse({
4345
url: '/organizations/org-slug/tags/',
@@ -113,10 +115,22 @@ describe('Incident Rules Form', () => {
113115
describe('Creating a new rule', () => {
114116
let createRule;
115117
beforeEach(() => {
118+
ProjectsStore.loadInitialData([
119+
project,
120+
{
121+
...project,
122+
id: '10',
123+
slug: 'project-slug-2',
124+
},
125+
]);
116126
createRule = MockApiClient.addMockResponse({
117127
url: '/organizations/org-slug/alert-rules/',
118128
method: 'POST',
119129
});
130+
MockApiClient.addMockResponse({
131+
url: '/projects/org-slug/project-slug-2/environments/',
132+
body: [],
133+
});
120134
});
121135

122136
/**
@@ -160,6 +174,43 @@ describe('Incident Rules Form', () => {
160174
expect(metric.startTransaction).toHaveBeenCalledWith({name: 'saveAlertRule'});
161175
});
162176

177+
it('can create a rule for a different project', async () => {
178+
const rule = TestStubs.MetricRule();
179+
createWrapper({
180+
rule: {
181+
...rule,
182+
id: undefined,
183+
eventTypes: ['default'],
184+
},
185+
});
186+
187+
// Clear field
188+
await userEvent.clear(screen.getByPlaceholderText('Enter Alert Name'));
189+
190+
// Enter in name so we can submit
191+
await userEvent.type(
192+
screen.getByPlaceholderText('Enter Alert Name'),
193+
'Incident Rule'
194+
);
195+
196+
// Change project
197+
await userEvent.click(screen.getByText('project-slug'));
198+
await userEvent.click(screen.getByText('project-slug-2'));
199+
200+
await userEvent.click(screen.getByLabelText('Save Rule'));
201+
202+
expect(createRule).toHaveBeenCalledWith(
203+
expect.anything(),
204+
expect.objectContaining({
205+
data: expect.objectContaining({
206+
name: 'Incident Rule',
207+
projects: ['project-slug-2'],
208+
}),
209+
})
210+
);
211+
expect(metric.startTransaction).toHaveBeenCalledWith({name: 'saveAlertRule'});
212+
});
213+
163214
it('creates a rule with generic_metrics dataset', async () => {
164215
organization.features = [...organization.features, 'mep-rollout-flag'];
165216
const rule = TestStubs.MetricRule();

static/app/views/alerts/rules/metric/ruleForm.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -634,6 +634,7 @@ class RuleFormContainer extends DeprecatedAsyncComponent<Props, State> {
634634
{
635635
...rule,
636636
...model.getTransformedData(),
637+
projects: [project.slug],
637638
triggers: sanitizedTriggers,
638639
resolveThreshold: isEmpty(resolveThreshold) ? null : resolveThreshold,
639640
thresholdType,

0 commit comments

Comments
 (0)