Skip to content
80 changes: 80 additions & 0 deletions src/actions/__tests__/audit-log-actions.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
/**
* @jest-environment jsdom
*/
import configureStore from "redux-mock-store";
import thunk from "redux-thunk";
import flushPromises from "flush-promises";
import { getRequest } from "openstack-uicore-foundation/lib/utils/actions";
import { getAuditLog } from "../audit-log-actions";
import * as methods from "../../utils/methods";

jest.mock("openstack-uicore-foundation/lib/utils/actions", () => ({
__esModule: true,
...jest.requireActual("openstack-uicore-foundation/lib/utils/actions"),
getRequest: jest.fn()
}));

describe("getAuditLog filters contract", () => {
const middlewares = [thunk];
const mockStore = configureStore(middlewares);
let capturedParams;

beforeEach(() => {
jest.spyOn(methods, "getAccessTokenSafely").mockReturnValue("TOKEN");

capturedParams = null;
getRequest.mockImplementation(() => (params) => {
capturedParams = params;
return () =>
Promise.resolve({
response: { data: [], total: 0, current_page: 1, last_page: 1 }
});
});
});

afterEach(() => {
jest.restoreAllMocks();
});

const buildStore = () =>
mockStore({ currentSummitState: { currentSummit: { id: 1 } } });

it("merges summit_id, entityFilter, and the array-shaped grid filter into filter[]", async () => {
const store = buildStore();

store.dispatch(
getAuditLog(["event_id==5"], "", 1, 100, "created", -1, ["user_id==42"])
);
await flushPromises();

expect(capturedParams["filter[]"]).toEqual([
"summit_id==1",
"event_id==5",
"user_id==42"
]);
});

it("appends entity_id==<term> for a numeric search term", async () => {
const store = buildStore();

store.dispatch(getAuditLog([], "123", 1, 100, "created", -1, []));
await flushPromises();

expect(capturedParams["filter[]"]).toEqual([
"summit_id==1",
"entity_id==123"
]);
});

it("appends action=@<term> for a non-numeric search term", async () => {
const store = buildStore();

store.dispatch(getAuditLog([], "restart", 1, 100, "created", -1, []));
await flushPromises();

expect(capturedParams["filter[]"]).toEqual([
"summit_id==1",
"action=@restart"
]);
});
});
44 changes: 13 additions & 31 deletions src/actions/audit-log-actions.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,35 +19,19 @@ import {
authErrorHandler,
escapeFilterValue
} from "openstack-uicore-foundation/lib/utils/actions";
import { getAccessTokenSafely, isNumericString } from "../utils/methods";
import {
getAccessTokenSafely,
isNumericString,
parseDateRangeFilter
} from "../utils/methods";
import { DEFAULT_CURRENT_PAGE, DEFAULT_ORDER_DIR } from "../utils/constants";
DEFAULT_CURRENT_PAGE,
DEFAULT_ORDER_DIR,
MAX_PER_PAGE
} from "../utils/constants";

export const CLEAR_LOG_PARAMS = "CLEAR_LOG_PARAMS";
export const REQUEST_LOG = "REQUEST_LOG";
export const RECEIVE_LOG = "RECEIVE_LOG";

const DEFAULT_PER_PAGE_AUDIT_LOG = 100;

const parseFilters = (filters, term = null) => {
const filter = [];

if (filters.created_date_filter) {
parseDateRangeFilter(filter, filters.created_date_filter, "created");
}

if (
filters.hasOwnProperty("user_id_filter") &&
Array.isArray(filters.user_id_filter) &&
filters.user_id_filter.length > 0
) {
filter.push(
`user_id==${filters.user_id_filter.map((t) => t.id).join("||")}`
);
}
const parseFilters = (filters = [], term = null) => {
const filter = Array.isArray(filters) ? [...filters] : [];

if (term) {
const escapedTerm = escapeFilterValue(term);
Expand All @@ -68,18 +52,17 @@ const parseFilters = (filters, term = null) => {
export const getAuditLog =
(
entityFilter = [],
term = null,
term = "",
page = DEFAULT_CURRENT_PAGE,
perPage = DEFAULT_PER_PAGE_AUDIT_LOG,
order = null,
orderDir = DEFAULT_ORDER_DIR,
filters = {}
perPage = MAX_PER_PAGE,
order = "created",
orderDir = 1,
filters = []
) =>
async (dispatch, getState) => {
const { currentSummitState } = getState();
const accessToken = await getAccessTokenSafely();
const { currentSummit } = currentSummitState;
const summitTZ = currentSummit.time_zone.name;
const summitFilter = [`summit_id==${currentSummit.id}`];

dispatch(startLoading());
Expand All @@ -99,7 +82,6 @@ export const getAuditLog =

params["filter[]"] = parsedFilters;

// order
if (order != null && orderDir != null) {
const orderDirSign = orderDir === DEFAULT_ORDER_DIR ? "+" : "-";
params.order = `${orderDirSign}${order}`;
Expand All @@ -110,7 +92,7 @@ export const getAuditLog =
createAction(RECEIVE_LOG),
`${window.AUDIT_LOG_API_BASE_URL}/api/v1/audit-logs`,
authErrorHandler,
{ page, perPage, order, orderDir, term, summitTZ, filters }
{ page, perPage, order, orderDir, term, filters }
)(params)(dispatch).then(() => {
dispatch(stopLoading());
});
Expand Down
Loading
Loading