Skip to content
This repository was archived by the owner on Jul 31, 2024. It is now read-only.

Commit 03db84b

Browse files
Merge pull request #25 from marucc/fix/create_key_file
KeyFile取得の失敗時のkeyFile再作成処理を修正
2 parents 7e9eeb9 + a416cfb commit 03db84b

File tree

2 files changed

+87
-32
lines changed

2 files changed

+87
-32
lines changed

src/__tests__/sdk/services/freee-cryptor.ts

Lines changed: 73 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,18 @@ import FreeeCryptor from '../../../sdk/services/freee-cryptor'
33

44
const key = Buffer.from('aaa', 'utf8')
55

6-
const mockGetWhenCreated = jest
7-
.fn()
8-
.mockReturnValueOnce([key])
9-
.mockRejectedValue(new Error('Must not be called'))
10-
11-
const mockGetWhenNotCreated = jest
12-
.fn()
13-
.mockRejectedValueOnce(new Error('Must not be called'))
14-
.mockReturnValueOnce([key])
15-
.mockRejectedValue(new Error('Must not be called'))
16-
17-
let isCreated = true
6+
const mockDownload = jest.fn()
7+
const mockExists = jest.fn()
8+
const mockSave = jest.fn()
189

1910
jest.mock('firebase-admin', () => {
2011
return {
2112
storage: () => ({
2213
bucket: (path: string) => ({
2314
file: (path: string) => ({
24-
download: async () =>
25-
isCreated ? mockGetWhenCreated() : mockGetWhenNotCreated(),
26-
save: () => (isCreated = true)
15+
download: async () => mockDownload(),
16+
exists: async () => mockExists(),
17+
save: async () => mockSave()
2718
})
2819
})
2920
})
@@ -36,26 +27,78 @@ const keyFileName = '201907'
3627

3728
describe('FreeeCryptor', () => {
3829
describe('getKey', () => {
39-
describe('when crypto key is already created', () => {
30+
beforeEach(async () => {
31+
mockDownload.mockReset()
32+
mockDownload
33+
.mockRejectedValue(new Error('Must not be called'))
34+
mockExists.mockReset()
35+
mockExists
36+
.mockRejectedValue(new Error('Must not be called'))
37+
mockSave.mockReset()
38+
mockSave
39+
.mockRejectedValue(new Error('Must not be called'))
40+
})
41+
42+
it('when crypto key is already created', async () => {
43+
mockDownload.mockReset()
44+
mockDownload
45+
.mockReturnValueOnce([key])
46+
.mockRejectedValue(new Error('Must not be called'))
47+
4048
const cryptor = new FreeeCryptor(bucket)
49+
expect(await cryptor['getKey'](keyFileName)).toStrictEqual(key)
50+
// return key from cache(no exception)
51+
expect(await cryptor['getKey'](keyFileName)).toStrictEqual(key)
52+
})
4153

42-
it('return key from storage', async () => {
43-
expect(await cryptor['getKey'](keyFileName)).toStrictEqual(key)
44-
})
45-
it('return key from cache(no exception)', async () => {
46-
expect(await cryptor['getKey'](keyFileName)).toStrictEqual(key)
47-
})
54+
it('when crypto key is not created yet', async () => {
55+
mockDownload.mockReset()
56+
mockDownload
57+
.mockRejectedValueOnce(new Error('crypto key does not exist'))
58+
.mockReturnValueOnce([key])
59+
.mockRejectedValue(new Error('Must not be called'))
60+
mockExists.mockReset()
61+
mockExists
62+
.mockReturnValueOnce([false])
63+
.mockRejectedValue(new Error('Must not be called'))
64+
mockSave.mockReset()
65+
mockSave
66+
.mockReturnValueOnce(true)
67+
.mockRejectedValue(new Error('Must not be called'))
68+
69+
const cryptor = new FreeeCryptor(bucket)
70+
expect(await cryptor['getKey'](keyFileName)).toStrictEqual(key)
71+
// return key from cache(no exception)
72+
expect(await cryptor['getKey'](keyFileName)).toStrictEqual(key)
4873
})
4974

50-
describe('when crypto key is not created yet', () => {
75+
it('when crypto key is in error', async () => {
76+
mockDownload.mockReset()
77+
mockDownload
78+
.mockRejectedValueOnce(new Error('Unknown download error'))
79+
.mockRejectedValue(new Error('Must not be called'))
80+
mockExists.mockReset()
81+
mockExists
82+
.mockRejectedValueOnce(new Error('Unknown exists error'))
83+
.mockRejectedValue(new Error('Must not be called'))
84+
5185
const cryptor = new FreeeCryptor(bucket)
52-
isCreated = false
53-
it('return key from storage after create key', async () => {
54-
expect(await cryptor['getKey'](keyFileName)).toStrictEqual(key)
55-
})
56-
it('return key from cache(no exception)', async () => {
57-
expect(await cryptor['getKey'](keyFileName)).toStrictEqual(key)
58-
})
86+
await expect(cryptor['getKey'](keyFileName)).rejects.toThrow('Unknown exists error')
87+
})
88+
89+
it('error getting crypto key only once', async () => {
90+
mockDownload.mockReset()
91+
mockDownload
92+
.mockRejectedValueOnce(new Error('Unknown error'))
93+
.mockReturnValueOnce([key])
94+
.mockRejectedValue(new Error('Must not be called'))
95+
mockExists.mockReset()
96+
mockExists
97+
.mockReturnValueOnce([true])
98+
.mockRejectedValue(new Error('Must not be called'))
99+
100+
const cryptor = new FreeeCryptor(bucket)
101+
expect(await cryptor['getKey'](keyFileName)).toStrictEqual(key)
59102
})
60103
})
61104
})

src/sdk/services/freee-cryptor.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,10 @@ class FreeeCryptor {
109109
try {
110110
return await this.get(keyFileName)
111111
} catch (error) {
112-
console.info('No key file for:', keyFileName)
113-
await this.create(keyFileName)
112+
if (!(await this.exists(keyFileName))) {
113+
console.info('No key file for:', keyFileName)
114+
await this.create(keyFileName)
115+
}
114116
return await this.get(keyFileName)
115117
}
116118
}
@@ -139,6 +141,16 @@ class FreeeCryptor {
139141
console.log('Crypto key is retrieved from storage for:', keyFileName)
140142
return response[0]
141143
}
144+
145+
private async exists(keyFileName: string) {
146+
const response = await this.bucket.file(keyFileName).exists()
147+
const isExists = response[0]
148+
console.log(
149+
`Crypto key ${isExists ? 'is' : 'is not'} exists storage for:`,
150+
keyFileName
151+
)
152+
return isExists
153+
}
142154
}
143155

144156
export default FreeeCryptor

0 commit comments

Comments
 (0)