Skip to content

Commit

Permalink
Improve user locks tests (#316)
Browse files Browse the repository at this point in the history
* add user module (#164)

* test: add creating a lock on table in userLocks module test

* fix: adjust console log type for userLocks (#317)

* add user module (#164)

* test: add creating a lock on table in userLocks module test
  • Loading branch information
Templada authored Dec 10, 2024
1 parent 54b4d8c commit e612c4c
Show file tree
Hide file tree
Showing 19 changed files with 458 additions and 4 deletions.
3 changes: 2 additions & 1 deletion src/reuse/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,8 @@ class ReuseLibrary {
formatter: utilQmate.formatter,
function: utilQmate.function,
system: utilQmate.system,
component: utilQmate.component
component: utilQmate.component,
userSettings: utilQmate.userSettings
};
global.util = {
...util,
Expand Down
3 changes: 3 additions & 0 deletions src/reuse/modules/util/Util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import formatter, { Formatter } from "./formatter";
import functionModule, { FunctionModule } from "./function";
import system, { System } from "./system";
import component, { Component } from "./component";
import userSettings, { UserSettings } from "./userSettings";


interface DataHooksExtended extends Data {
decrypt: (input: string | Array<string>) => string;
Expand All @@ -21,6 +23,7 @@ export class Util {
function: FunctionModule = functionModule;
system: System = system;
component: Component = component;
userSettings: UserSettings = userSettings;
}

export default new Util();
181 changes: 181 additions & 0 deletions src/reuse/modules/util/userSettings.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,181 @@
"use strict";

import { VerboseLoggerFactory } from "../../helper/verboseLogger";

/**
* @class userSettings
* @memberof util
*/

export class UserSettings {
private vlf = new VerboseLoggerFactory("util", "userSettings");
private _srvInstance = null;

private async initS4UserSettingService(user: string, password: string): Promise<any> {
if (!this._srvInstance) {
const vl = this.vlf.initLog(await this.initS4UserSettingService);
const params = browser.config.params;
if (params?.systemUrl) {
try {
this._srvInstance = await service.odata.init(`${params.systemUrl}/sap/opu/odata/UI2/INTEROP`, user, password);
} catch (error) {
if (error instanceof Error) {
throw new Error(`Failed to initialize S4 User Setting Service: ${error.message}.`);
} else {
throw new Error("Failed to initialize S4 User Setting Service.");
}
}
} else {
throw new Error("System URL is missing in the config file.");
}
}
}

public async setLanguageFromUserSettings(user: string, password: string) {
const vl = this.vlf.initLog(this.setLanguageFromUserSettings);
await this.initS4UserSettingService(user, password);
process.env.USER_SETTINGS_LANG_KEY = await this._getLanguageResponse(this._srvInstance);
util.console.info(`Language Key: ${process.env.USER_SETTINGS_LANG_KEY} was set.`);
}

public async setDateFormatFromUserSettings(user: string, password: string) {
const vl = this.vlf.initLog(this.setDateFormatFromUserSettings);
await this.initS4UserSettingService(user, password);
process.env.USER_SETTINGS_DATE_FORMAT = await this._getDateFormatsResponse(this._srvInstance); //removes: the whitespace characters 0-* and the brackets including the content of the brackets.
util.console.info(`Date Format: ${process.env.USER_SETTINGS_DATE_FORMAT} was set.`);
}

public async setTimeFormatFromUserSettings(user: string, password: string) {
const vl = this.vlf.initLog(this.setTimeFormatFromUserSettings);
await this.initS4UserSettingService(user, password);
process.env.USER_SETTINGS_TIME_FORMAT = await this._getTimeFormatResponse(this._srvInstance);
util.console.info(`Time Format: ${process.env.USER_SETTINGS_TIME_FORMAT} was set.`);
}

public async setTimeZoneFromUserSettings(user: string, password: string) {
const vl = this.vlf.initLog(this.setTimeZoneFromUserSettings);
await this.initS4UserSettingService(user, password);
const res = await service.odata.get(this._srvInstance, "UserProfileProperties", { id: "TIME_ZONE", shellType: "FLP" });
process.env.USER_SETTINGS_TIME_ZONE = await this._getTimeZoneResponse(this._srvInstance);
util.console.info(`Time Zone: ${process.env.USER_SETTINGS_TIME_ZONE} was set.`);
}

public async setNumberFormatFromUserSettings(user: string, password: string) {
const vl = this.vlf.initLog(this.setNumberFormatFromUserSettings);
await this.initS4UserSettingService(user, password);
process.env.USER_SETTINGS_NUMBER_FORMAT = await this._getNumberFormatResponse(this._srvInstance);
util.console.info(`Number Format: ${process.env.USER_SETTINGS_NUMBER_FORMAT} was set.`);
}

public async setS4UserSettings(user: string, password: string) {
const vl = this.vlf.initLog(this.setS4UserSettings);
try {
await this.initS4UserSettingService(user, password);
await this.setDateFormatFromUserSettings(user, password);
await this.setLanguageFromUserSettings(user, password);
await this.setNumberFormatFromUserSettings(user, password);
await this.setTimeFormatFromUserSettings(user, password);
await this.setTimeZoneFromUserSettings(user, password);
} catch (error) {
vl.log(`Function: 'setUserSettingsForS4' failed: Unable to set the UserSettings: ${error}`);
}
}

public async getLanguageFromUserSettings(user: string, password: string): Promise<string> {
const vl = this.vlf.initLog(this.getLanguageFromUserSettings);
await this.initS4UserSettingService(user, password);
return await this._getLanguageResponse(this._srvInstance);
}

public async getDateFormatFromUserSettings(user: string, password: string): Promise<string> {
const vl = this.vlf.initLog(this.getDateFormatFromUserSettings);
await this.initS4UserSettingService(user, password);
return await this._getDateFormatsResponse(this._srvInstance);
}

public async getTimeFormatFromUserSettings(user: string, password: string): Promise<string> {
const vl = this.vlf.initLog(this.getTimeFormatFromUserSettings);
await this.initS4UserSettingService(user, password);
return await this._getTimeFormatResponse(this._srvInstance);
}

public async getTimeZoneFromUserSettings(user: string, password: string): Promise<string> {
const vl = this.vlf.initLog(this.getTimeZoneFromUserSettings);
await this.initS4UserSettingService(user, password);
return await this._getTimeZoneResponse(this._srvInstance);
}

public async getNumberFormatFromUserSettings(user: string, password: string): Promise<string> {
const vl = this.vlf.initLog(this.getNumberFormatFromUserSettings);
return await this._getNumberFormatResponse(this._srvInstance);
}

private async _getTimeZoneResponse(srvInstance: any): Promise<string> {
try {
const res = await service.odata.get(srvInstance, "UserProfileProperties", { id: "TIME_ZONE", shellType: "FLP" });
return res.value.replace("/", ", ");
} catch (error) {
if (error instanceof Error) {
throw new Error(`Failed to get Time Zone from User Settings: ${error.message}.`);
} else {
throw new Error("Failed to get Time Zone from User Settings.");
}
}
}

private async _getTimeFormatResponse(srvInstance: any): Promise<string> {
try {
const res = await service.odata.get(srvInstance, "UserProfileProperties", { id: "TIME_FORMAT", shellType: "FLP" });
const resUserData = await service.odata.get(this._srvInstance, "UserProfilePropertyValues", { id: "TIME_FORMAT", shellType: "FLP", value: res.value });
return resUserData.description.replace(/\s*\(.*?\)$/, "");
} catch (error) {
if (error instanceof Error) {
throw new Error(`Failed to get Time Format from User Settings: ${error.message}.`);
} else {
throw new Error("Failed to get Time Format from User Settings.");
}
}
}

private async _getDateFormatsResponse(srvInstance: any): Promise<string> {
try {
const res = await service.odata.get(srvInstance, "UserProfileProperties", { id: "DATE_FORMAT", shellType: "FLP" });
const resUserData = await service.odata.get(this._srvInstance, "UserProfilePropertyValues", { id: "DATE_FORMAT", shellType: "FLP", value: res.value });
return resUserData.description.replace(/\s*\(.*?\)$/, "");
} catch (error) {
if (error instanceof Error) {
throw new Error(`Failed to get Date Format from User Settings: ${error.message}.`);
} else {
throw new Error("Failed to get Date Format from User Settings.");
}
}
}

private async _getLanguageResponse(srvInstance: any): Promise<string> {
try {
const res = await service.odata.get(srvInstance, "UserProfileProperties", { id: "LANGUAGE", shellType: "FLP" });
return res.value;
} catch (error) {
if (error instanceof Error) {
throw new Error(`Failed to get Language from User Settings: ${error.message}.`);
} else {
throw new Error("Failed to get Language from User Settings.");
}
}
}

private async _getNumberFormatResponse(srvInstance: any): Promise<string> {
try {
const res = await service.odata.get(srvInstance, "UserProfileProperties", { id: "NUMBER_FORMAT", shellType: "FLP" });
const resUserData = await service.odata.get(srvInstance, "UserProfilePropertyValues", { id: "NUMBER_FORMAT", shellType: "FLP", value: res.value });
return resUserData.description.replace(/\s*\(.*?\)$/, "");
} catch (error) {
if (error instanceof Error) {
throw new Error(`Failed to get Number Format from User Settings: ${error.message}.`);
} else {
throw new Error("Failed to get Number Format from User Settings.");
}
}
}
}
export default new UserSettings();
6 changes: 3 additions & 3 deletions test/reuse/flp/userLocks/data/data.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"baseUrl": "c1bbc2b33bcca4a0ca6ed541e91b746baf0783d855596075e604d703d040679027cfa25e32a9f5b37c3854ef6722e0f2a0f69d6c2b9357e085f2162111fd76a243a156cb9c81533f1478c2b0530787424dc2a63cd54d652b52a16f2585183f184de650b3eea927b8343be0c2d139baa26f69ea962d14a828958c47f47b570d1654d88263bc1cc95f9a417400802253303fb6c3d856f67517e51ffdd9e2051ca74e59e496799c72a8ec7bf4a0a310ee43f97ce598e7328e7310f5f1e1385aa358fd69d42af1c67bcc13d8be3a6f55b17e2cd4bc755107a0e2e2bd29e817637f0a2c7c70e772612c54b5821540fc395a734271f8ccb6b1c70cf4896b7a1622dbcb54e3eca3d7d89e35fe39b2c3dcad60759d1025744a3e9ba00140db98c29d38ffc8b1251311349e09c76a370071bcfa325cd1c6748a00c99cb5d600113d5151d174609cc314a9775a444937ff55b63112ce9f09714bdab3e6bcb35c6e9682404f",
"systemUrl": "9693baf8f7eb9c12c938eaad6e539be5e448e8a76f6215d2fc8177e1a71f0f03cab56efa90a82227b1beece8e020a1f59d68ebd0436dc3b3519bdec41c40d2f06ba22bb7a588ac6cfe7ff9d6cfc475e67a4dcb0f2738fc7d97c54233ed347598b4f3e8348ba7c3759fe78fe743887d88d7fd745893afc087d2da751f1694a946020ec393aa15549a7f1aedeb046f459f68a356322c9b473dd4fb4c01341b2e3dd49a2d35ec0bb6d5325d9664365610acf35cef5ee4e8efe65893ac7bd994c66c214f7d8b93c9fc251b82353f1c7b7416d779c11f89eb03aea79e5f16d4dee9122a7591d0a63f33c15847e5fdd432982de692835167f798702e279261dd6d89d3b0dad071ff6101e0fa8b2607f9d6c48e2b0a3f67af63b3075e54030cef20d1e8dc2ea657087f294a6df7394d0c57d9d61f4152d41a0d01b2449edb2dcdb4954b5dcb6ef695e435937b0ddf0485baf5d9ce48ced177a351f957fcb780ba3b783e",
"username": "b03e3e5d34425372952a9a0e55365e642738650748ed145fd92e89c4aee4fcd7300c13c388bfc8522a30fbe2b32b410ddef556e05803f5a3a7d9754e01c0175ad8a75f2b603d5c7fccc09c0a909be587ab5caad09602849a88614d7067805d89360786dafaa4f40ada36789cc77c699426e3bf0a3976b23a9603011d8ec88b60943ef919ed6784433e4be4a862e0d66bf0e70a0b6ffa5fb08bcf0a2af2977ff75c7b259de579fc91e1d05f830581a4f37640fd4a6fd62285e8e7ff0d558c072fd7a2307a783a8a5752b80bb07d52908a8261648f69dca61b2d5037f286caa32a57d82e92eeb78753a50218364c88d9038babcbe064916bcd8375b8c170535c4093c74e440ba821c2a5dc37cc2e9cbfb6e36a7b6c22bedacd271598f4a42f2681e3bbdf5e26bb6c38e695ee361c2ee5434c1fe5c6738896050126aca87a64a209ad81a3eabf3af0fb00d3ceec1795b330935e7c22eb0655c4df167450421bcc2c",
"baseUrl": "ff15b4297a13063b1ac3a39febf8604cbda1b45ca633f4486821a37600af9e42bdaf1f165d6e13c75935dfad436e02801e32ca497c61dc7543c7f2d1e491795bdf227aaca4433ff11fbc52ea9b3333212c87f8f860df92d9c14195c41e6aeaa2eff3a7d900d2ae4a0e304c419a0fa5ede0cf046f9b938e8ce76b2432432b9a099601e9b934919b923ba54680b716106d4eac856f4f5dabd4cc186a03463b168f93dfa559829b9e9b5d6326bea1249254340ed054a14ab311dc03d2817892dd7d4c0a226a5a615f6ce9637a485c18ccf256f619fb524923e21fbcb55e004ce336d99f29a393846dc35414083104b43f150d3c2695f17ce29a9b6f7e7fe2299f40adc89a21e920de02e2df31730f5b8facfa2ec9449f31898bb343afd104001747800184c4cce22a06f06ed3bab2a0db3d8ad59dc330b520427e78416ae340f2c375e62b7c8006e0b49c627e951b4dea51de059eeabc7f11b39c2cb3f12cdf0299",
"systemUrl": "cca476c6015846bf5af4dd3d2d56bf3cb2778e25ced298129f3c975221bd9f461e4d2648e3571ed2d5bfc58014654f09d4c04146918c7edbbbe10b481edab8182a7b012bcf90ef6d52465c15be16d82bef521211e3166226fde522e64e0fd9a802261e51303bcebb3913740862a036a2d88620576a285b025c68a67607dd07917ac6055855d34427033cf525674ea44a1b66a3c9ea861b4a36962ff74264d2f3d1e34bdb5bb2e20c00c06aa20abdcb9b6170d19c52a384c1fa36fc8a3ca81f95f55131423ce64abf51d392c5546fac41925034c6881cc779704edd191978b10fddcb5151c4000c1ecdc0c569b166296d94f6ce13567a4f4e4747c474765c44cdc4224a039300539fe5689b872e2a78b93a44ffaba8fbd3865a9d83087fd527ebfef645fac3d497795435bbbec22b4f9121faa8d964a034916bdc014e1ec49c98c13d6843288a0f374a3c164df9f0b625d5c7032efe52da5f9949004dbefb2e5e",
"username": "cd5d64bf00a47ee406c8ef22e03a8f2eaae240da55484227f9b23ae679399c13ad284bb4b6810fc0d6d50d76b0564e5bea49489a5089a495d96de0fa5f57c9112187f15dcb583c2f22d0e25727be2e6ff07cde6d65daeb0ec9ce5411642380ad4f3f46f1e30fdc5488e2cec7862224dbebc809880af96fb434865988302b7b8d96137cf446eedbeac8b26145d2223707b46665147d72fce9be86434873f13587933544f1546be8905c5d453e516f35757c2d98b582d35762e16245c407f071854d26e75498ddfbe0f896cfd07c9d526f89de288d99181ef8336cfd5c9e936d8808f422cbf6a7b705851436b367fed47c58a28adc00f2448f6b8adf44d7737b5762cf1ce41eb9a8c5310b5746c07573ea1aaa0af54f496ba6fc2158dff614e92eeeef57c22d040c97664e54d119fc2e6d106ebcc754cff4d4b885c32c273f68d700822f5d573a1ffd2cb3465296074dbf4b0b46171a69bdd8f3427d285f93f8d2",
"password": "f29d3de7092b06610ea12aa60513a9bc5178c69f67286c4377414ef34b0bdf8727aa2787807cf4678376ccdb2d51715ea34e88450544a510137e3eb552fab98f7bdbc302e9b3c30a25744d4719246181bb63eeac931a1807da43f587baf309a097c9af216639796c97ed4068332af4f33594eea8eba02c5eec31a852167b7ab0eadee460b4534d51c5278b81e5cab4fe5f67ffddeb1070f40d2b0b521e4a9acf30fc408899ff08d22d53c2fc67ca92bd94ae2f9d193240a03f97bb197bed107e9e591d48d8830845794f9bd0016e1ae065b42a3830134ed9241e3cb37f8c7e5d5d76fa8df9cb973eb968ce945db5de10c0c8bb004e8504a6e0e4554f58350add6da6d8efd1bdb55d12bbcbe676fa04170ac3e2ad831c97f37b6251ce7bbcbb10a7f2212d599875f61566833ec3e03a9f58dff2463c326202887302dc71f3e09b73cd3eaf7bd07977abff0962ea4d7bd890cc9dadbf5240bedc2c3e1802156504"
}
18 changes: 18 additions & 0 deletions test/reuse/flp/userLocks/deleteExistingLockEntries.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,31 @@ describe("userLocks", function () {

it("Preparation: Set systemUrl ", async function () {
browser.config.params.systemUrl = util.data.decrypt(data.systemUrl);
browser.config.baseUrl = util.data.decrypt(data.baseUrl);
user = util.data.decrypt(data.username);
pw = util.data.decrypt(data.password);
});

it("Preparation: Navigate to application", async function () {
await ui5.navigation.navigateToApplication("ForeignExchangeFixingReference-createFXFixingReference");
});

it("Preparation: Login", async function () {
await ui5.session.login(user, pw);
});

it("Preparation: Switch to iframe", async function () {
await util.browser.switchToIframe("iframe[id='application-ForeignExchangeFixingReference-createFXFixingReference-iframe']");
});

it("Preparation: Click 'New Entry'", async function () {
await nonUi5.userInteraction.click("div[id='M0:48::btn[5]']");
});

it("Execution & Verification: delete existing locks", async function () {
await flp.userLocks.deleteExistingLockEntries(user, pw);
});

});

});
1 change: 1 addition & 0 deletions test/reuse/flp/userLocks/getNumberOfLockEntries.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ describe("userLocks", function () {

it("Preparation: Set systemUrl ", async function () {
browser.config.params.systemUrl = util.data.decrypt(data.systemUrl);
browser.config.baseUrl = util.data.decrypt(data.baseUrl);
user = util.data.decrypt(data.username);
pw = util.data.decrypt(data.password);
});
Expand Down
6 changes: 6 additions & 0 deletions test/reuse/util/userSettings/data/data.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"baseUrl": "2ce343d5118887f39b71fe56b87046fc65f3030054a46e36aac4495a08e67249bfce49360fc998b3690191fa98e4d6f8c04d54986fb51bb976aea0322918d18d6a52250865f30bd284c98188692bbc8eb4e218409e2d7e9b54c58334642b8f97df100e9d03afad2045d85b05b58df5382da68e82fc29005ae1842ecf0ba4baeeedbf0ab5206d461e3c2aaa91c1c3906be29346f7c898edd9aa739d857c1f0be520975c24c964ddf7557489fe920a10d1baaff81dc5f2eb4ebbb3d95b5a6f1748216f16ef1248e45c229217114bbfd4b5ca4e1595e4e2fcb54a41118c6ad0eaf837aa1564ac73d781e25177699a4b5f6aa4560b4160264264906f99df8b02de5aafae2d43bccfe0f5aa1b8aa3fafeeec7770c73dcd6d4ad0a893ed06a0ca0076ebbc6b39ba2d3d1fc277dcbd03457b1ae51d181e4a4e4a99e60d0eb643a887e45263f8671b80375b03f74c1dc2c426ffca679c9cac9bee21691d8ff9ea4a7e34d",
"systemUrl": "817bac533d84867cf08db1aa05d763453bad031d3e6ba5f674452da8ed1c7a525085003a481053a59e7b382f0c71461f641beabf6043e4fb3a76aabde151bdbf0ed76f12c8512bba93c263315b7b23a1a986a99cbc727a24124faed74445fe48759aea0256d9df9839c409872cbc41889c5f3d9955560af97088221aac7bbbd4df3899945cdc8eccd6389eb77dd6e4d7eec0a91fb3389ced2077fb24118a0b00337ef7e6f992048cb5f9bfc3c5af8bf14e3b278decc1663c3109086e0db1f736e3abc3235b5929f3df19fe605aea3e8239b842f98e66095c9c3ef975aa9f9c0cae77beee7b6c8f5bc37e8a32f06ada9ba0202262c525f33354cbde790c98b6195e157431b52f85e380232c449c46753b9a964d399d68a27a6d775918092b61ead6cb743207219d3ae61964d2d7c9ebeb870f2e69e1c613bfa083bd954b556b6a07f7bcc2db78ada63457f4f376e60f17fa2a4c3548a435e901260b1a7ca7bb93",
"username": "2ab173a889f752d3a42db739f2dd2cd179e72d747550b028db67f774aa8530e3ea3a95e582446015634449be9ab658098b9048401833d69a998be483fdaa7676214a21af6fbbe4f4273207b2a39f4efec5998266b1b4f45b1423aa7133fc31dc56041ba4049c278ec3fddbed766b3f0dc114fb1a9cef2058aebb3c4b9d91200a2d9531dc93bae58514f233f0e2f49f5b64cbb78d6035053a1f7353c80cfe151fed90f6e6300568a32a3e3226324a5a20e42492e5fbc42c1a9c6c8c136d4c91be327f939bed973d5991abbbd98c509c232028bcaf0a40b9a8c805ae66a48fd899ef919b92cad8b094c9c8f0aac44222a4bc973964958ead8ec7252c45ffcdaca0aa44b81580af603f6e3c3ee61943dec6de61f32ac5a3c3d89c85d16fb108caf85cd2967f6553418f520f9c3eabbb28907535d1ccb8cc205f934473eb64259d12385bb44b51dcf146d0f8718eb0379610895bd27c718a1be046a5c5f12e596bd2",
"password": "f29d3de7092b06610ea12aa60513a9bc5178c69f67286c4377414ef34b0bdf8727aa2787807cf4678376ccdb2d51715ea34e88450544a510137e3eb552fab98f7bdbc302e9b3c30a25744d4719246181bb63eeac931a1807da43f587baf309a097c9af216639796c97ed4068332af4f33594eea8eba02c5eec31a852167b7ab0eadee460b4534d51c5278b81e5cab4fe5f67ffddeb1070f40d2b0b521e4a9acf30fc408899ff08d22d53c2fc67ca92bd94ae2f9d193240a03f97bb197bed107e9e591d48d8830845794f9bd0016e1ae065b42a3830134ed9241e3cb37f8c7e5d5d76fa8df9cb973eb968ce945db5de10c0c8bb004e8504a6e0e4554f58350add6da6d8efd1bdb55d12bbcbe676fa04170ac3e2ad831c97f37b6251ce7bbcbb10a7f2212d599875f61566833ec3e03a9f58dff2463c326202887302dc71f3e09b73cd3eaf7bd07977abff0962ea4d7bd890cc9dadbf5240bedc2c3e1802156504"
}
21 changes: 21 additions & 0 deletions test/reuse/util/userSettings/getDateFormatFromUserSettings.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
const data = require("./data/data.json");

describe("userSettings", function () {
const DATE_FORMAT_LENGTH = 10;

describe("getDateFormatFromUserSettings.spec - passing date format", function () {

it("Preparation: Set systemUrl ", async function () {
browser.config.params.systemUrl = util.data.decrypt(data.systemUrl);
});

it("Execution & Verification: Set User Date", async function () {
const userDateFormat = await util.userSettings.getDateFormatFromUserSettings(util.data.decrypt(data.username), util.data.decrypt(data.password));
const date = await common.date.getToday("yyyy/mm/dd");
const userDate = await common.date.getToday(userDateFormat);
//Ensure returned date is a valid date
common.assertion.expectEqual(new Date(date), new Date(userDate));
});
});

});
Loading

0 comments on commit e612c4c

Please sign in to comment.