Skip to content
This repository was archived by the owner on Sep 27, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 5 additions & 6 deletions src/__mocks__/api/v3/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { default as company } from '~/__mocks__/fixtures/v3/company.js'
import { default as daily } from '~/__mocks__/fixtures/v3/daily.js'
import { default as quarter } from '~/__mocks__/fixtures/v3/quarter.js'
import { Daily } from '~/entities/v3/daily'
import { Quarter } from '~/entities/v3/quarter'

export class BuffettCodeApiClientV3 {
public mockCompany = jest.fn()
Expand All @@ -18,9 +19,8 @@ export class BuffettCodeApiClientV3 {
return this.mockCompany()['data']
}

quarter(): object | null {
const quarter = this.mockQuarter()['data']
return quarter ? quarter : null
quarter(): Quarter {
return Quarter.fromResponse(this.mockQuarter())
}

daily(): Daily {
Expand All @@ -31,8 +31,7 @@ export class BuffettCodeApiClientV3 {
return Daily.fromResponse(this.mockDaily())
}

ondemandQuarter(): object | null {
const quarter = this.mockQuarter()['data']
return quarter ? quarter : null
ondemandQuarter(): Quarter {
return Quarter.fromResponse(this.mockQuarter())
}
}
33 changes: 29 additions & 4 deletions src/__mocks__/services/quarter-cache.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,44 @@
import { Quarter } from '~/entities/v3/quarter'
import { YearQuarter } from '~/fiscal-periods/year-quarter'

export class QuarterCache {
static readonly cache = {}

static get(ticker: string, yearQuarter: YearQuarter): object | null {
const cached = QuarterCache.cache[`${ticker}-${yearQuarter}`]
static get(ticker: string, yearQuarter: YearQuarter): Quarter | null {
const cachedData = this.getData(ticker, yearQuarter)
const cachedColumnDescription = this.getColumnDescription()
if (cachedData == undefined || cachedColumnDescription == undefined) {
return null
}

return new Quarter(cachedData, cachedColumnDescription)
}

static getData(ticker: string, yearQuarter: YearQuarter): object | null {
const cached = this.cache[`${ticker}-${yearQuarter}`]
return cached === undefined ? null : cached
}

static getColumnDescription(): object | null {
const cached = this.cache['column-description']
return cached === undefined ? null : cached
}

static put(ticker: string, quarter: object): void {
QuarterCache.cache[
static put(ticker: string, quarter: Quarter): void {
this.putData(ticker, quarter.data)
this.putColumnDescription(quarter.columnDescription)
}

static putData(ticker: string, quarter: object): void {
this.cache[
`${ticker}-${quarter['fiscal_year']}Q${quarter['fiscal_quarter']}`
] = quarter
}

static putColumnDescription(columnDescription: object): void {
this.cache['column-description'] = columnDescription
}

// for testing
static clearAll(): void {
Object.keys(this.cache).forEach(key => delete this.cache[key])
Expand Down
32 changes: 20 additions & 12 deletions src/api/v2/caching-client.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -79,19 +79,19 @@ describe('quarter', () => {
const period = new YearQuarterParam(2018, 1)

test('(uncached)', () => {
expect(QuarterCache.get(ticker, period.toYearQuarter())).toBeNull()
expect(QuarterCache.getData(ticker, period.toYearQuarter())).toBeNull()
Copy link
Copy Markdown
Contributor Author

@akiomik akiomik Nov 13, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v2の既存のコードは、キャッシュの取得時は QuarterCache.get だったのを QuarterCache.getData に、設定時は QuarterCache.put だったのを QuarterCache.putData に変更すれば同じ挙動で動くようになります


const client = new CachingBuffettCodeApiClientV2('token')
const res = client.quarter(ticker, period)
expect(res).not.toBeNull()
expect(res['fiscal_year']).toBe(period.year)
expect(res['fiscal_quarter']).toBe(period.quarter)

expect(QuarterCache.get(ticker, period.toYearQuarter())).toEqual(res)
expect(QuarterCache.getData(ticker, period.toYearQuarter())).toEqual(res)
})

test('(cached)', () => {
const cached = QuarterCache.get(ticker, period.toYearQuarter())
const cached = QuarterCache.getData(ticker, period.toYearQuarter())
expect(cached).not.toBeNull()

const client = new CachingBuffettCodeApiClientV2('token')
Expand All @@ -100,7 +100,9 @@ describe('quarter', () => {
expect(res['fiscal_year']).toBe(period.year)
expect(res['fiscal_quarter']).toBe(period.quarter)

expect(QuarterCache.get(ticker, period.toYearQuarter())).toEqual(cached)
expect(QuarterCache.getData(ticker, period.toYearQuarter())).toEqual(
cached
)
})
})

Expand All @@ -112,15 +114,17 @@ describe('quarter', () => {
const period = new YearQuarterParam('LY', 'LQ')

test('(uncached)', () => {
expect(QuarterCache.get(ticker, new YearQuarter(2018, 1))).toBeNull()
expect(QuarterCache.getData(ticker, new YearQuarter(2018, 1))).toBeNull()

const client = new CachingBuffettCodeApiClientV2('token')
const res = client.quarter(ticker, period)
expect(res).not.toBeNull()
expect(res['fiscal_year']).toBe(2018)
expect(res['fiscal_quarter']).toBe(1)

expect(QuarterCache.get(ticker, new YearQuarter(2018, 1))).toEqual(res)
expect(QuarterCache.getData(ticker, new YearQuarter(2018, 1))).toEqual(
res
)
})
})
})
Expand All @@ -136,24 +140,26 @@ describe('ondemandQuarter', () => {
const period = new YearQuarterParam(2018, 1)

test('(uncached)', () => {
expect(QuarterCache.get(ticker, period.toYearQuarter())).toBeNull()
expect(QuarterCache.getData(ticker, period.toYearQuarter())).toBeNull()

const client = new CachingBuffettCodeApiClientV2('token')
const res = client.ondemandQuarter(ticker, period)
expect(res).not.toBeNull()

expect(QuarterCache.get(ticker, period.toYearQuarter())).toEqual(res)
expect(QuarterCache.getData(ticker, period.toYearQuarter())).toEqual(res)
})

test('(cached)', () => {
const cached = QuarterCache.get(ticker, period.toYearQuarter())
const cached = QuarterCache.getData(ticker, period.toYearQuarter())
expect(cached).not.toBeNull()

const client = new CachingBuffettCodeApiClientV2('token')
const res = client.ondemandQuarter(ticker, period)
expect(res).toEqual(cached)

expect(QuarterCache.get(ticker, period.toYearQuarter())).toEqual(cached)
expect(QuarterCache.getData(ticker, period.toYearQuarter())).toEqual(
cached
)
})
})

Expand All @@ -165,15 +171,17 @@ describe('ondemandQuarter', () => {
const period = new YearQuarterParam('LY', 'LQ')

test('(uncached)', () => {
expect(QuarterCache.get(ticker, new YearQuarter(2018, 1))).toBeNull()
expect(QuarterCache.getData(ticker, new YearQuarter(2018, 1))).toBeNull()

const client = new CachingBuffettCodeApiClientV2('token')
const res = client.ondemandQuarter(ticker, period)
expect(res).not.toBeNull()
expect(res['fiscal_year']).toBe(2018)
expect(res['fiscal_quarter']).toBe(1)

expect(QuarterCache.get(ticker, new YearQuarter(2018, 1))).toEqual(res)
expect(QuarterCache.getData(ticker, new YearQuarter(2018, 1))).toEqual(
res
)
})
})
})
8 changes: 4 additions & 4 deletions src/api/v2/caching-client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ export class CachingBuffettCodeApiClientV2 extends BuffettCodeApiClientV2 {

quarter(ticker: string, period: YearQuarterParam): object | null {
if (period.convertibleToYearQuarter()) {
const cached = QuarterCache.get(ticker, period.toYearQuarter())
const cached = QuarterCache.getData(ticker, period.toYearQuarter())
if (cached) {
return cached
}
Expand All @@ -50,14 +50,14 @@ export class CachingBuffettCodeApiClientV2 extends BuffettCodeApiClientV2 {
return null
}

QuarterCache.put(ticker, quarter)
QuarterCache.putData(ticker, quarter)

return quarter
}

ondemandQuarter(ticker: string, period: YearQuarterParam): object | null {
if (period.convertibleToYearQuarter()) {
const cached = QuarterCache.get(ticker, period.toYearQuarter())
const cached = QuarterCache.getData(ticker, period.toYearQuarter())
if (cached) {
return cached
}
Expand All @@ -68,7 +68,7 @@ export class CachingBuffettCodeApiClientV2 extends BuffettCodeApiClientV2 {
return null
}

QuarterCache.put(ticker, quarter)
QuarterCache.putData(ticker, quarter)

return quarter
}
Expand Down
16 changes: 8 additions & 8 deletions src/api/v3/caching-client.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -87,8 +87,8 @@ describe('quarter', () => {
const client = new CachingBuffettCodeApiClientV3('token')
const res = client.quarter(ticker, period)
expect(res).not.toBeNull()
expect(res['fiscal_year']).toBe(period.year)
expect(res['fiscal_quarter']).toBe(period.quarter)
expect(res.data['fiscal_year']).toBe(period.year)
expect(res.data['fiscal_quarter']).toBe(period.quarter)

expect(QuarterCache.get(ticker, period.toYearQuarter())).toEqual(res)
})
Expand All @@ -100,8 +100,8 @@ describe('quarter', () => {
const client = new CachingBuffettCodeApiClientV3('token')
const res = client.quarter(ticker, period)
expect(res).toEqual(cached)
expect(res['fiscal_year']).toBe(period.year)
expect(res['fiscal_quarter']).toBe(period.quarter)
expect(res.data['fiscal_year']).toBe(period.year)
expect(res.data['fiscal_quarter']).toBe(period.quarter)

expect(QuarterCache.get(ticker, period.toYearQuarter())).toEqual(cached)
})
Expand All @@ -120,8 +120,8 @@ describe('quarter', () => {
const client = new CachingBuffettCodeApiClientV3('token')
const res = client.quarter(ticker, period)
expect(res).not.toBeNull()
expect(res['fiscal_year']).toBe(2018)
expect(res['fiscal_quarter']).toBe(1)
expect(res.data['fiscal_year']).toBe(2018)
expect(res.data['fiscal_quarter']).toBe(1)

expect(QuarterCache.get(ticker, new YearQuarter(2018, 1))).toEqual(res)
})
Expand Down Expand Up @@ -173,8 +173,8 @@ describe('ondemandQuarter', () => {
const client = new CachingBuffettCodeApiClientV3('token')
const res = client.ondemandQuarter(ticker, period)
expect(res).not.toBeNull()
expect(res['fiscal_year']).toBe(2018)
expect(res['fiscal_quarter']).toBe(1)
expect(res.data['fiscal_year']).toBe(2018)
expect(res.data['fiscal_quarter']).toBe(1)

expect(QuarterCache.get(ticker, new YearQuarter(2018, 1))).toEqual(res)
})
Expand Down
13 changes: 3 additions & 10 deletions src/api/v3/caching-client.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { BuffettCodeApiClientV3 } from '~/api/v3/client'
import { Daily } from '~/entities/v3/daily'
import { Quarter } from '~/entities/v3/quarter'
import { DateParam } from '~/fiscal-periods/date-param'
import { YearQuarterParam } from '~/fiscal-periods/year-quarter-param'
import { CompanyCache } from '~/services/company-cache'
Expand Down Expand Up @@ -35,7 +36,7 @@ export class CachingBuffettCodeApiClientV3 extends BuffettCodeApiClientV3 {
return daily
}

quarter(ticker: string, period: YearQuarterParam): object | null {
quarter(ticker: string, period: YearQuarterParam): Quarter {
if (period.convertibleToYearQuarter()) {
const cached = QuarterCache.get(ticker, period.toYearQuarter())
if (cached) {
Expand All @@ -44,10 +45,6 @@ export class CachingBuffettCodeApiClientV3 extends BuffettCodeApiClientV3 {
}

const quarter = super.quarter(ticker, period)
if (!quarter) {
return null
}

QuarterCache.put(ticker, quarter)

return quarter
Expand All @@ -65,7 +62,7 @@ export class CachingBuffettCodeApiClientV3 extends BuffettCodeApiClientV3 {
return daily
}

ondemandQuarter(ticker: string, period: YearQuarterParam): object | null {
ondemandQuarter(ticker: string, period: YearQuarterParam): Quarter {
if (period.convertibleToYearQuarter()) {
const cached = QuarterCache.get(ticker, period.toYearQuarter())
if (cached) {
Expand All @@ -74,10 +71,6 @@ export class CachingBuffettCodeApiClientV3 extends BuffettCodeApiClientV3 {
}

const quarter = super.ondemandQuarter(ticker, period)
if (!quarter) {
return null
}

QuarterCache.put(ticker, quarter)

return quarter
Expand Down
21 changes: 17 additions & 4 deletions src/api/v3/client.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { HttpError } from '~/api/http-error'
import { useMockedUrlFetchApp } from '~/api/test-helper'
import { BuffettCodeApiClientV3 } from '~/api/v3/client'
import { Daily } from '~/entities/v3/daily'
import { Quarter } from '~/entities/v3/quarter'
import { DateParam } from '~/fiscal-periods/date-param'
import { DateRange } from '~/fiscal-periods/date-range'
import { YearQuarter } from '~/fiscal-periods/year-quarter'
Expand Down Expand Up @@ -102,7 +103,9 @@ describe('BuffettCodeApiClientV3', () => {
const client = new BuffettCodeApiClientV3('foo')
const ticker = '2371'
const period = new YearQuarterParam(2018, 1)
expect(client.quarter(ticker, period)).toEqual(quarter['data'])
expect(client.quarter(ticker, period)).toEqual(
Quarter.fromResponse(quarter)
)
expect(mockFetch.mock.calls.length).toBe(1)
expect(mockFetch.mock.calls[0].length).toBe(2)
expect(mockFetch.mock.calls[0][0]).toBe(
Expand All @@ -115,15 +118,23 @@ describe('BuffettCodeApiClientV3', () => {
})

test('bulkQuarter', () => {
const mockFetch = useMockedUrlFetchApp(200, JSON.stringify(quarter))
const bulkQuarter = {
data: {
'2020-09-06': quarter['data']
},
column_description: quarter['column_description'] // eslint-disable-line @typescript-eslint/camelcase
}
const mockFetch = useMockedUrlFetchApp(200, JSON.stringify(bulkQuarter))

const client = new BuffettCodeApiClientV3('foo')
const ticker = '2371'
const range = new YearQuarterRange(
new YearQuarter(2018, 1),
new YearQuarter(2018, 4)
)
expect(client.bulkQuarter(ticker, range)).toEqual(quarter['data'])
expect(client.bulkQuarter(ticker, range)).toEqual(
Quarter.fromBulkResponse(bulkQuarter)
)
expect(mockFetch.mock.calls.length).toBe(1)
expect(mockFetch.mock.calls[0].length).toBe(2)
expect(mockFetch.mock.calls[0][0]).toBe(
Expand All @@ -141,7 +152,9 @@ describe('BuffettCodeApiClientV3', () => {
const client = new BuffettCodeApiClientV3('foo')
const ticker = '2371'
const period = new YearQuarterParam(2018, 1)
expect(client.ondemandQuarter(ticker, period)).toEqual(quarter['data'])
expect(client.ondemandQuarter(ticker, period)).toEqual(
Quarter.fromResponse(quarter)
)
expect(mockFetch.mock.calls.length).toBe(1)
expect(mockFetch.mock.calls[0].length).toBe(2)
expect(mockFetch.mock.calls[0][0]).toBe(
Expand Down
Loading