forked from AkkomaGang/admin-fe
462 lines
16 KiB
JavaScript
462 lines
16 KiB
JavaScript
import { wrapUpdatedSettings } from '@/store/modules/normalizers'
|
|
import _ from 'lodash'
|
|
|
|
describe('Wrap settings', () => {
|
|
it('wraps values without keys with type atom', () => {
|
|
const settings = { ':level': { _value: ['atom', 'warn'] }}
|
|
const result = wrapUpdatedSettings(':quack', settings, {})
|
|
const expectedResult = [{ group: ':quack', key: ':level', value: ':warn' }]
|
|
expect(_.isEqual(result, expectedResult)).toBeTruthy()
|
|
})
|
|
|
|
it('wraps :backends setting in group :logger', () => {
|
|
const settings = { ':backends': { _value:
|
|
[['atom', 'tuple', 'module'], [':console', 'Quack.Logger', ':ex_syslogger']]
|
|
}}
|
|
const result = wrapUpdatedSettings(':logger', settings, {})
|
|
const expectedResult = [{
|
|
group: ':logger',
|
|
key: ':backends',
|
|
value: [':console', 'Quack.Logger', { 'tuple': ['ExSyslogger', ':ex_syslogger'] }]
|
|
}]
|
|
expect(_.isEqual(result, expectedResult)).toBeTruthy()
|
|
})
|
|
|
|
it('wraps :types setting in group :mime', () => {
|
|
const settings = { ':types': { _value: ['map', {
|
|
'application/ld+json': [['list', 'string'], ['activity+json']],
|
|
'application/xml': [['list', 'string'], ['xml']],
|
|
'application/xrd+xml': [['list', 'string'], ['xrd+xml']]
|
|
}]}}
|
|
const result = wrapUpdatedSettings(':mime', settings, {})
|
|
const expectedResult = [{
|
|
group: ':mime',
|
|
key: ':types',
|
|
value: {
|
|
'application/ld+json': ['activity+json'],
|
|
'application/xml': ['xml'],
|
|
'application/xrd+xml': ['xrd+xml']
|
|
}
|
|
}]
|
|
expect(_.isEqual(result, expectedResult)).toBeTruthy()
|
|
})
|
|
|
|
it('wraps :mascots setting in group :assets', () => {
|
|
const settings = { ':assets': { ':mascots': [['keyword', 'map'], {
|
|
':pleroma_fox_tan_shy': ['', { ':mime_type': 'image/png', ':url': '/images/pleroma-fox-tan-shy.png' }],
|
|
':pleroma_fox_tan': ['', { ':mime_type': 'image/png', ':url': '/images/pleroma-fox-tan-smol.png' }],
|
|
}]}}
|
|
const state = { ':pleroma': { ':assets': {}}}
|
|
const result = wrapUpdatedSettings(':pleroma', settings, state)
|
|
const expectedResult = [{
|
|
group: ':pleroma',
|
|
key: ':assets',
|
|
value: [{ tuple: [':mascots', [
|
|
{ tuple: [':pleroma_fox_tan_shy', { ':mime_type': 'image/png', ':url': '/images/pleroma-fox-tan-shy.png'}] },
|
|
{ tuple: [':pleroma_fox_tan', { ':mime_type': 'image/png', ':url': '/images/pleroma-fox-tan-smol.png'}] }
|
|
]]}]
|
|
}]
|
|
expect(_.isEqual(result, expectedResult)).toBeTruthy()
|
|
})
|
|
|
|
it('wraps settings with type keyword', () => {
|
|
const settings1 = { 'Pleroma.Upload': { ':proxy_opts':
|
|
[ 'keyword', {
|
|
':redirect_on_failure': ['boolean', true],
|
|
':http': ['keyword', { ':proxy_url': [['string', 'tuple'], 'localhost:3090' ]}]
|
|
}]
|
|
}}
|
|
const state1 = { ':pleroma': { 'Pleroma.Upload': {}}}
|
|
const result1 = wrapUpdatedSettings(':pleroma', settings1, state1)
|
|
const expectedResult1 = [{
|
|
group: ':pleroma',
|
|
key: 'Pleroma.Upload',
|
|
value: [{ tuple: [':proxy_opts', [
|
|
{ tuple: [':redirect_on_failure', true] },
|
|
{ tuple: [':http', [{ tuple: [':proxy_url', 'localhost:3090'] }]] }
|
|
]]}]
|
|
}]
|
|
|
|
const settings2 = { ':media_proxy': { ':proxy_opts':
|
|
['keyword', {
|
|
':max_body_length': ['integer', 26210000],
|
|
':http': ['keyword', {
|
|
':proxy_url': [['string', 'tuple'], [':socks5', '127.0.0.1', '9020']],
|
|
':adapter': ['keyword', {
|
|
':ssl_options': ['keyword', {
|
|
':versions': [['list', 'atom'], [':tlsv1', ':tlsv1.1']]
|
|
}]
|
|
}]
|
|
}]
|
|
}]
|
|
}}
|
|
const state2 = { ':pleroma': { ':media_proxy': {}}}
|
|
const result2 = wrapUpdatedSettings(':pleroma', settings2, state2)
|
|
const expectedResult2 = [{
|
|
group: ':pleroma',
|
|
key: ':media_proxy',
|
|
value: [{ tuple: [':proxy_opts', [
|
|
{ tuple: [':max_body_length', 26210000] },
|
|
{ tuple: [':http',
|
|
[{ tuple: [ ':proxy_url', { tuple: [ ':socks5', '127.0.0.1', '9020' ] }]},
|
|
{ tuple: [':adapter',
|
|
[{ tuple: [':ssl_options', [{ tuple: [':versions', [':tlsv1', ':tlsv1.1']]}]]}]
|
|
]}]
|
|
]}
|
|
]]}]
|
|
}]
|
|
|
|
expect(_.isEqual(result1, expectedResult1)).toBeTruthy()
|
|
expect(_.isEqual(result2, expectedResult2)).toBeTruthy()
|
|
})
|
|
|
|
it('wraps settings that includes keyword in type', () => {
|
|
const settings1 = { 'Oban': { ':queues': [
|
|
['keyword', 'integer'],
|
|
{ ':activity_expiration': ['integer', 15],
|
|
':background': ['integer', 10],
|
|
':federator_incoming': ['integer', 30]}
|
|
]}}
|
|
const state1 = { ':pleroma': { 'Oban': {}}}
|
|
const result1 = wrapUpdatedSettings(':pleroma', settings1, state1)
|
|
const expectedResult1 = [{
|
|
group: ':pleroma',
|
|
key: 'Oban',
|
|
value: [{ tuple: [':queues', [
|
|
{ tuple: [':activity_expiration', 15] },
|
|
{ tuple: [':background', 10] },
|
|
{ tuple: [':federator_incoming', 30]}
|
|
]]}]
|
|
}]
|
|
|
|
const settings2 = { ':emoji': { ':groups': [
|
|
['keyword', ['list', 'string']],
|
|
{ ':custom': [['list'], ['/emoji/*.png', '/emoji/**/*.png']],
|
|
':another_group': ['list', ['/custom_emoji/*.png']]}
|
|
]}}
|
|
const state2 = { ':pleroma': { ':emoji': {}}}
|
|
const result2 = wrapUpdatedSettings(':pleroma', settings2, state2)
|
|
const expectedResult2 = [{
|
|
group: ':pleroma',
|
|
key: ':emoji',
|
|
value: [{ tuple: [':groups', [
|
|
{ tuple: [':custom', ['/emoji/*.png', '/emoji/**/*.png']]},
|
|
{ tuple: [':another_group', ['/custom_emoji/*.png']]}
|
|
]]}]
|
|
}]
|
|
|
|
expect(_.isEqual(result1, expectedResult1)).toBeTruthy()
|
|
expect(_.isEqual(result2, expectedResult2)).toBeTruthy()
|
|
})
|
|
|
|
it('wraps :replace setting', () => {
|
|
const settings = { ':mrf_keyword': { ':replace': [
|
|
['list', 'tuple'],
|
|
{ 'pattern': ['list', 'replacement'],
|
|
'/\w+/': ['list', 'test_replacement']}
|
|
]}}
|
|
const state = { ':pleroma': { ':mrf_keyword': {}}}
|
|
const result = wrapUpdatedSettings(':pleroma', settings, state)
|
|
const expectedResult = [{
|
|
group: ':pleroma',
|
|
key: ':mrf_keyword',
|
|
value: [{ tuple: [':replace', [
|
|
{ tuple: ['pattern', 'replacement'] },
|
|
{ tuple: ['/\w+/', 'test_replacement'] }
|
|
]]}]
|
|
}]
|
|
|
|
expect(_.isEqual(result, expectedResult)).toBeTruthy()
|
|
})
|
|
|
|
it('wraps settings with type atom', () => {
|
|
const settings = {
|
|
':ldap': { ':sslopts': [ 'keyword', { ':verify': ['atom', 'verify_peer']}]},
|
|
':assets': { ':default_mascot': ['atom', 'pleroma_fox_tan_test']}
|
|
}
|
|
const state = { ':pleroma': { ':sslopts': {}, ':assets': {}}}
|
|
const result = wrapUpdatedSettings(':pleroma', settings, state)
|
|
const expectedResult = [{
|
|
group: ':pleroma',
|
|
key: ':ldap',
|
|
value: [{ tuple: [':sslopts', [{tuple: [':verify', ':verify_peer']}]]}]
|
|
}, {
|
|
group: ':pleroma',
|
|
key: ':assets',
|
|
value: [{ tuple: [':default_mascot', ':pleroma_fox_tan_test']}]
|
|
}]
|
|
|
|
expect(_.isEqual(result, expectedResult)).toBeTruthy()
|
|
})
|
|
|
|
it('wraps settings with type string and tuple', () => {
|
|
const settings1 = { ':media_proxy': { ':proxy_opts':
|
|
['keyword', {
|
|
':http': ['keyword', { ':proxy_url': [['string', 'tuple'], 'localhost:9020']}]
|
|
}]
|
|
}}
|
|
const state1 = { ':pleroma': { ':media_proxy': {}}}
|
|
const result1 = wrapUpdatedSettings(':pleroma', settings1, state1)
|
|
const expectedResult1 = [{
|
|
group: ':pleroma',
|
|
key: ':media_proxy',
|
|
value: [{ tuple: [':proxy_opts', [
|
|
{ tuple: [':http',
|
|
[{ tuple: [':proxy_url', 'localhost:9020'] }]
|
|
]}
|
|
]]}]
|
|
}]
|
|
|
|
const settings2 = { ':media_proxy': { ':proxy_opts':
|
|
['keyword', {
|
|
':http': ['keyword', { ':proxy_url': [['string', 'tuple'], [':socks5', '127.0.0.1', '9020']]}]
|
|
}]
|
|
}}
|
|
const state2 = { ':pleroma': { ':media_proxy': {}}}
|
|
const result2 = wrapUpdatedSettings(':pleroma', settings2, state2)
|
|
const expectedResult2 = [{
|
|
group: ':pleroma',
|
|
key: ':media_proxy',
|
|
value: [{ tuple: [':proxy_opts', [
|
|
{ tuple: [':http',
|
|
[{ tuple: [ ':proxy_url', { tuple: [':socks5', '127.0.0.1', '9020'] }]}]
|
|
]}
|
|
]]}]
|
|
}]
|
|
|
|
expect(_.isEqual(result1, expectedResult1)).toBeTruthy()
|
|
expect(_.isEqual(result2, expectedResult2)).toBeTruthy()
|
|
})
|
|
|
|
it('wraps settings with type atom and tuple', () => {
|
|
const settings1 = { 'Oban': { ':prune': [['atom', 'tuple'], ':disabled']}}
|
|
const state1 = { ':pleroma': { 'Oban': {}}}
|
|
const result1 = wrapUpdatedSettings(':pleroma', settings1, state1)
|
|
const expectedResult1 = [{
|
|
group: ':pleroma',
|
|
key: 'Oban',
|
|
value: [{ tuple: [':prune', ':disabled']}]
|
|
}]
|
|
|
|
const settings2 = { 'Oban': { ':prune':
|
|
[['atom', 'tuple'], [':maxlen', 1500]]
|
|
}}
|
|
const state2 = { ':pleroma': { 'Oban': {}}}
|
|
const result2 = wrapUpdatedSettings(':pleroma', settings2, state2)
|
|
const expectedResult2 = [{
|
|
group: ':pleroma',
|
|
key: 'Oban',
|
|
value: [{ tuple: [':prune', {tuple: [':maxlen', 1500]}]}]
|
|
}]
|
|
|
|
expect(_.isEqual(result1, expectedResult1)).toBeTruthy()
|
|
expect(_.isEqual(result2, expectedResult2)).toBeTruthy()
|
|
})
|
|
|
|
it('wraps settings with type map', () => {
|
|
const settings1 = { ':instance': { ':poll_limits': ['map', { ':min_expiration': ['integer', 100] }]}}
|
|
const state1 = { ':pleroma': { ':instance': { ':poll_limits': {
|
|
':max_expiration': 31536000,
|
|
':max_option_chars': 200,
|
|
':max_options': 20,
|
|
':min_expiration': 100
|
|
}}}}
|
|
const result1 = wrapUpdatedSettings(':pleroma', settings1, state1)
|
|
const expectedResult1 = [{
|
|
group: ':pleroma',
|
|
key: ':instance',
|
|
value: [{ tuple: [':poll_limits', {
|
|
':max_expiration': 31536000,
|
|
':max_option_chars': 200,
|
|
':max_options': 20,
|
|
':min_expiration': 100
|
|
}]}]
|
|
}]
|
|
|
|
const settings2 = { ':email_notifications': { ':digest': ['map', {
|
|
':active': ['boolean', true],
|
|
':schedule': ['string', '0 0 0'],
|
|
':inactivity_threshold': ['integer', 10]
|
|
}]}}
|
|
const state2 = { ':pleroma': { ':email_notifications': { ':digest': {
|
|
':active': true,
|
|
':inactivity_threshold': 10,
|
|
':interval': 7,
|
|
':schedule': '0 0 0'
|
|
}}}}
|
|
const result2 = wrapUpdatedSettings(':pleroma', settings2, state2)
|
|
const expectedResult2 = [{
|
|
group: ':pleroma',
|
|
key: ':email_notifications',
|
|
value: [{ tuple: [':digest', {
|
|
':active': true,
|
|
':inactivity_threshold': 10,
|
|
':interval': 7,
|
|
':schedule': '0 0 0'
|
|
}]}]
|
|
}]
|
|
|
|
expect(_.isEqual(result1, expectedResult1)).toBeTruthy()
|
|
expect(_.isEqual(result2, expectedResult2)).toBeTruthy()
|
|
})
|
|
|
|
it('wraps settings with type that includes map', () => {
|
|
const settings1 = { ':mrf_subchain': { ':match_actor': [['map', ['list', 'string']], {
|
|
'~r/https:\/\/example.com/s': ['list', ['Elixir.Pleroma.Web.ActivityPub.MRF.DropPolicy']],
|
|
'~r/https:\/\/test.com': ['list', ['Elixir.Pleroma.Web.ActivityPub.MRF.TestPolicy']]
|
|
}]}}
|
|
const state1 = { ':pleroma': { ':mrf_subchain': { ':match_actor': [
|
|
{ '~r/https:\/\/example.com/s': { value: ['Elixir.Pleroma.Web.ActivityPub.MRF.DropPolicy'], id: '1234' }},
|
|
{ '~r/https:\/\/test.com': { value: ['Elixir.Pleroma.Web.ActivityPub.MRF.TestPolicy'], id: '5678' } }
|
|
]
|
|
}}}
|
|
|
|
const result1 = wrapUpdatedSettings(':pleroma', settings1, state1)
|
|
const expectedResult1 = [{
|
|
group: ':pleroma',
|
|
key: ':mrf_subchain',
|
|
value: [{ tuple: [':match_actor', {
|
|
'~r/https:\/\/example.com/s': ['Elixir.Pleroma.Web.ActivityPub.MRF.DropPolicy'],
|
|
'~r/https:\/\/test.com': ['Elixir.Pleroma.Web.ActivityPub.MRF.TestPolicy']
|
|
}]}]
|
|
}]
|
|
|
|
const settings2 = { 'Pleroma.Web.MediaProxy.Invalidation.Http': {
|
|
':options': ['keyword', { ':params': [['map', 'string'], { aaa: ['list', 'bbb'], xxx: ['list', 'zzz'] }]}]
|
|
}}
|
|
const state2 = { ':pleroma': { 'Pleroma.Web.MediaProxy.Invalidation.Http': {
|
|
':options': { ':params': [{ aaa: { value: 'bbb', id: '1' }, xxx: { value: 'zzz', id: '2' }}] }
|
|
}}}
|
|
|
|
const result2 = wrapUpdatedSettings(':pleroma', settings2, state2)
|
|
const expectedResult2 = [{
|
|
group: ':pleroma',
|
|
key: 'Pleroma.Web.MediaProxy.Invalidation.Http',
|
|
value: [{ tuple: [':options', [
|
|
{ tuple: [':params', { aaa: 'bbb', xxx: 'zzz' }]}
|
|
]]}]
|
|
}]
|
|
|
|
expect(_.isEqual(result1, expectedResult1)).toBeTruthy()
|
|
expect(_.isEqual(result2, expectedResult2)).toBeTruthy()
|
|
})
|
|
|
|
it('wraps settings with type [`list`, `map`]', () => {
|
|
const settings = { ':manifest': { ':icons': [['map', 'list'], [
|
|
{ ':src': '/static/logo.png', ':type': 'image/png' },
|
|
{ ':src': '/static/icon.png', ':type': 'image/png' }
|
|
]]}}
|
|
|
|
const state = { ':pleroma': { ':manifest': {
|
|
':background_color': '#191b22',
|
|
':theme_color': '#282c37',
|
|
':icons': [
|
|
[
|
|
{ 'id': 'f21318c4', 'key': ':src', 'value': '/static/logo.png' },
|
|
{ 'id': 'f4b87549', 'key': ':type', 'value': 'image/png' }
|
|
], [
|
|
{ 'id': 'f31d351e', 'key': ':src', 'value': '/static/icon.png' },
|
|
{ 'id': 'f1455852', 'key': ':type', 'value': 'image/png' }
|
|
]
|
|
]
|
|
}}}
|
|
|
|
const result = wrapUpdatedSettings(':pleroma', settings, state)
|
|
const expectedResult = [{
|
|
group: ':pleroma',
|
|
key: ':manifest',
|
|
value: [{ tuple: [':icons', [
|
|
{ ':src': '/static/logo.png', ':type': 'image/png' },
|
|
{ ':src': '/static/icon.png', ':type': 'image/png' }
|
|
]]}]
|
|
}]
|
|
|
|
expect(_.isEqual(result, expectedResult)).toBeTruthy()
|
|
})
|
|
|
|
it('wraps settings with type [`list`, `map`]', () => {
|
|
const settings = { ':manifest': { ':icons': [['map', 'list'], [
|
|
{ ':src': '/static/logo.png', ':type': 'image/png' },
|
|
{ ':src': '/static/icon.png', ':type': 'image/png' }
|
|
]]}}
|
|
|
|
const state = { ':pleroma': { ':manifest': {
|
|
':background_color': '#191b22',
|
|
':theme_color': '#282c37',
|
|
':icons': [
|
|
[
|
|
{ 'id': 'f21318c4', 'key': ':src', 'value': '/static/logo.png' },
|
|
{ 'id': 'f4b87549', 'key': ':type', 'value': 'image/png' }
|
|
], [
|
|
{ 'id': 'f31d351e', 'key': ':src', 'value': '/static/icon.png' },
|
|
{ 'id': 'f1455852', 'key': ':type', 'value': 'image/png' }
|
|
]
|
|
]
|
|
}}}
|
|
|
|
const result = wrapUpdatedSettings(':pleroma', settings, state)
|
|
const expectedResult = [{
|
|
group: ':pleroma',
|
|
key: ':manifest',
|
|
value: [{ tuple: [':icons', [
|
|
{ ':src': '/static/logo.png', ':type': 'image/png' },
|
|
{ ':src': '/static/icon.png', ':type': 'image/png' }
|
|
]]}]
|
|
}]
|
|
|
|
expect(_.isEqual(result, expectedResult)).toBeTruthy()
|
|
})
|
|
|
|
|
|
it('wraps IP setting', () => {
|
|
const settings = { ':gopher': { ':ip': ['tuple', '127.0.0.1']}}
|
|
const state = { ':pleroma': { ':gopher': {}}}
|
|
const result = wrapUpdatedSettings(':pleroma', settings, state)
|
|
const expectedResult = [{
|
|
group: ':pleroma',
|
|
key: ':gopher',
|
|
value: [{ tuple: [':ip', { tuple: [127, 0, 0, 1] }]}]
|
|
}]
|
|
|
|
expect(_.isEqual(result, expectedResult)).toBeTruthy()
|
|
})
|
|
|
|
it('wraps args setting in Pleroma.Upload.Filter.Mogrify group', () => {
|
|
const settings = { 'Pleroma.Upload.Filter.Mogrify': { ':args': [
|
|
['string', ['list', 'string'], ['list', 'tuple']],
|
|
['strip', '{ "implode", "1"]}']
|
|
]}}
|
|
const state = { ':pleroma': { 'Pleroma.Upload.Filter.Mogrify': {}}}
|
|
const result = wrapUpdatedSettings(':pleroma', settings, state)
|
|
const expectedResult = [{
|
|
group: ':pleroma',
|
|
key: 'Pleroma.Upload.Filter.Mogrify',
|
|
value: [{tuple: [':args', ['strip', '{ "implode", "1"]}']]}]
|
|
}]
|
|
|
|
expect(_.isEqual(result, expectedResult)).toBeTruthy()
|
|
})
|
|
|
|
it('wraps regular settings', () => {
|
|
const settings = { ':http_security': {
|
|
':report_uri': ['string', 'https://test.com'],
|
|
':ct_max_age': ['integer', 150000],
|
|
':sts': ['boolean', true],
|
|
':methods': [['list', 'string'], ['POST', 'PUT', 'PATCH']]
|
|
}}
|
|
const state = { ':pleroma': { ':http_security': {}}}
|
|
const result = wrapUpdatedSettings(':pleroma', settings, state)
|
|
const expectedResult = [{
|
|
group: ':pleroma',
|
|
key: ':http_security',
|
|
value: [
|
|
{ tuple: [':report_uri', 'https://test.com'] },
|
|
{ tuple: [':ct_max_age', 150000] },
|
|
{ tuple: [':sts', true] },
|
|
{ tuple: [':methods', ['POST', 'PUT', 'PATCH']] }
|
|
]
|
|
}]
|
|
|
|
expect(_.isEqual(result, expectedResult)).toBeTruthy()
|
|
})
|
|
})
|