diff --git a/src/cookie.ts b/src/cookie.ts index d4494aa..adc4e74 100644 --- a/src/cookie.ts +++ b/src/cookie.ts @@ -3,8 +3,8 @@ const cookie = { * 原生 JavaScript 获取 cookie 值 * @param name */ - getCookie(name: string) { - const arr = document.cookie.match(new RegExp('(^| )' + name + '=([^;]*)(;|$)')); + getCookie(name: string, cookiesStr: string = document.cookie) { + const arr = cookiesStr.match(new RegExp('(^| )' + name + '=([^;]*)(;|$)')); if (arr != null) { try { return unescape(decodeURI(arr[2])); @@ -52,7 +52,8 @@ const cookie = { name: string, value: string | number | object | boolean, days?: number, - domainStr?: string + domainStr?: string, + path: string = '/' ) { let expires = ''; if (days) { @@ -64,7 +65,7 @@ const cookie = { if (domainStr) { domain = '; domain=' + domainStr; } - document.cookie = name + '=' + value + expires + domain + '; path=/'; + document.cookie = name + '=' + value + expires + domain + '; path=' + path; }, }; diff --git a/test/cookie.test.ts b/test/cookie.test.ts new file mode 100644 index 0000000..0576d62 --- /dev/null +++ b/test/cookie.test.ts @@ -0,0 +1,98 @@ +import cookie from '../src/cookie'; + +type TCookie = { + name?: string; + value?: string; + expires?: string; + domain?: string; + path?: string; +}; + +let cookies: TCookie[] = []; + +Object.defineProperty(window.document, 'cookie', { + get() { + return cookies.map(({ name, value }) => `${name}=${value}`).join('; '); + }, + set(value: string) { + const innerAttrs = ['path', 'domain', 'expires']; + const attrs = value.split(';').map((attr) => attr.trim()); + const cookie: TCookie = {}; + attrs.forEach((attrStr) => { + const [key, val] = attrStr.split('='); + if (!innerAttrs.includes(key.toLocaleLowerCase())) { + cookie['name'] = key; + cookie['value'] = val; + } else { + cookie[key.toLocaleLowerCase()] = val; + } + }); + cookie.path = cookie.path || '/'; + const oldCookieIndex = cookies.findIndex( + ({ name, domain, path }) => + name === cookie.name && domain === cookie.domain && path === cookie.path + ); + const isDelete = cookie.expires && new Date(cookie.expires).getTime() <= Date.now(); + if (oldCookieIndex !== -1) { + isDelete + ? cookies.splice(oldCookieIndex, 1) + : cookies.splice(oldCookieIndex, 1, cookie); + } else { + !isDelete && cookies.push(cookie); + } + }, +}); + +describe('test cookie utils', () => { + + beforeEach(() => { + cookies = [] + }) + + test('should get cookie value with name', () => { + document.cookie = 'a=1; domain=; path=/'; + expect(cookie.getCookie('a')).toBe('1'); + expect(cookie.getCookie('a', 'a=2; c=3;')).toBe('2') + }) + + test('should return all cookies object', () => { + document.cookie = 'a=1; domain=; path=/'; + document.cookie = 'b=2; domain=; path=/'; + expect(cookie.getAllCookies()).toEqual({ a: "1", b: "2" }); + }) + + test('should support set cookie', () => { + cookie.setCookie('a', '1'); + expect(cookie.getCookie('a')).toBe('1') + + const day = 3; + cookie.setCookie('b', '2', day, 'test'); + const foundCookie = cookies.find(item => item.name === 'b' && item.domain === 'test') + expect(foundCookie).not.toBeUndefined(); + + const expires = new Date(foundCookie!.expires as string).getTime(); + const expiresNow = new Date(Date.now() + day * 24 * 60 * 60 * 1000).getTime() + expect(expires).toBeLessThan(expiresNow) + }) + + test('should support delete cookie', () => { + cookie.setCookie('a', 1); + cookie.deleteCookie('a') + expect(cookie.getCookie('a')).toBeNull(); + + cookie.setCookie('b', 1, 3, 'test', '/test'); + cookie.deleteCookie('b') + expect(cookie.getCookie('b')).not.toBeNull(); + cookie.deleteCookie('b', 'test', '/test') + expect(cookie.getCookie('b')).toBeNull(); + }) + + test('should suppport delete all cookies', () => { + cookie.setCookie('a', 1, 3, 'test', '/'); + cookie.setCookie('b', 2, 3, 'test', '/'); + cookie.deleteAllCookies('', '/') + expect(cookie.getAllCookies()).not.toEqual({}); + cookie.deleteAllCookies('test', '/') + expect(cookie.getAllCookies()).toEqual({}); + }) +})