diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/ResourcePicker/ResourcePicker.test.tsx b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/ResourcePicker/ResourcePicker.test.tsx
index 75e9f90b142..4e2922b4568 100644
--- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/ResourcePicker/ResourcePicker.test.tsx
+++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/ResourcePicker/ResourcePicker.test.tsx
@@ -1,5 +1,6 @@
import { act, render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
+import { omit } from 'lodash';
import React from 'react';
import createMockDatasource from '../../__mocks__/datasource';
@@ -23,23 +24,26 @@ const singleResourceSelectionURI =
'/subscriptions/def-456/resourceGroups/dev-3/providers/Microsoft.Compute/virtualMachines/db-server';
const noop: any = () => {};
-function createMockResourcePickerData() {
+function createMockResourcePickerData(preserveImplementation?: string[]) {
const mockDatasource = createMockDatasource();
const mockResourcePicker = new ResourcePickerData(
createMockInstanceSetttings(),
mockDatasource.azureMonitorDatasource
);
- mockResourcePicker.getSubscriptions = jest.fn().mockResolvedValue(createMockSubscriptions());
- mockResourcePicker.getResourceGroupsBySubscriptionId = jest
- .fn()
- .mockResolvedValue(createMockResourceGroupsBySubscription());
- mockResourcePicker.getResourcesForResourceGroup = jest.fn().mockResolvedValue(mockResourcesByResourceGroup());
- mockResourcePicker.getResourceURIFromWorkspace = jest.fn().mockReturnValue('');
- mockResourcePicker.getResourceURIDisplayProperties = jest.fn().mockResolvedValue({});
- mockResourcePicker.search = jest.fn().mockResolvedValue(mockSearchResults());
+ const mockFunctions = omit(
+ {
+ getSubscriptions: jest.fn().mockResolvedValue(createMockSubscriptions()),
+ getResourceGroupsBySubscriptionId: jest.fn().mockResolvedValue(createMockResourceGroupsBySubscription()),
+ getResourcesForResourceGroup: jest.fn().mockResolvedValue(mockResourcesByResourceGroup()),
+ getResourceURIFromWorkspace: jest.fn().mockReturnValue(''),
+ getResourceURIDisplayProperties: jest.fn().mockResolvedValue({}),
+ search: jest.fn().mockResolvedValue(mockSearchResults()),
+ },
+ preserveImplementation || []
+ );
- return mockResourcePicker;
+ return Object.assign(mockResourcePicker, mockFunctions);
}
const queryType: ResourcePickerQueryType = 'logs';
@@ -284,6 +288,25 @@ describe('AzureMonitor ResourcePicker', () => {
expect(subscriptionCheckboxAfterClear).toBeInTheDocument();
});
+ it('should throw an error if no namespaces are found', async () => {
+ const resourcePickerData = createMockResourcePickerData(['getResourceGroupsBySubscriptionId']);
+ render(
+
+ );
+ const subscriptionExpand = await screen.findByLabelText('Expand Primary Subscription');
+ await subscriptionExpand.click();
+ const error = await screen.findByRole('alert');
+ expect(error).toHaveTextContent('An error occurred while requesting resources from Azure Monitor');
+ expect(error).toHaveTextContent(
+ 'Unable to resolve a list of valid metric namespaces. Validate the datasource configuration is correct and required permissions have been granted for all subscriptions. Grafana requires at least the Reader role to be assigned.'
+ );
+ });
+
describe('when rendering resource picker without any selectable entry types', () => {
it('renders no checkboxes', async () => {
await act(async () => {
diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/resourcePicker/resourcePickerData.ts b/public/app/plugins/datasource/grafana-azure-monitor-datasource/resourcePicker/resourcePickerData.ts
index 94fbb907dde..0dd259b7143 100644
--- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/resourcePicker/resourcePickerData.ts
+++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/resourcePicker/resourcePickerData.ts
@@ -364,6 +364,12 @@ export default class ResourcePickerData extends DataSourceWithBackend