feat(cms): clarify sponsor ordering
This commit is contained in:
@@ -35,13 +35,13 @@ const partner = (name: string, tier: 1 | 2 | 3, sortOrder: number) => ({
|
||||
})
|
||||
|
||||
const partners = [
|
||||
partner('Tier One B', 1, 2),
|
||||
partner('Tier One B', 1, 200),
|
||||
partner('Tier Three H', 3, 8),
|
||||
partner('Tier Two B', 2, 2),
|
||||
partner('Tier Two B', 2, 20),
|
||||
partner('Tier Three A', 3, 1),
|
||||
partner('Tier One A', 1, 1),
|
||||
partner('Tier One A', 1, 100),
|
||||
partner('Tier Three C', 3, 3),
|
||||
partner('Tier Two A', 2, 1),
|
||||
partner('Tier Two A', 2, 10),
|
||||
partner('Tier Three B', 3, 2),
|
||||
partner('Tier Three D', 3, 4),
|
||||
partner('Tier Three E', 3, 5),
|
||||
@@ -102,7 +102,7 @@ describe('responsive sponsor hierarchy', () => {
|
||||
|
||||
afterEach(() => cleanup())
|
||||
|
||||
it('groups by Partner tier and sorts each band by Partner sortOrder', () => {
|
||||
it('keeps tiers separate and applies Partner sortOrder only within each tier', () => {
|
||||
const grouped = groupSponsorsByTier(partners)
|
||||
|
||||
expect(grouped[1].map(({ name }) => name)).toEqual(['Tier One A', 'Tier One B'])
|
||||
@@ -117,14 +117,32 @@ describe('responsive sponsor hierarchy', () => {
|
||||
'Tier Three G',
|
||||
'Tier Three H',
|
||||
])
|
||||
expect([...grouped[1], ...grouped[2], ...grouped[3]].map(({ name }) => name)).toEqual([
|
||||
'Tier One A',
|
||||
'Tier One B',
|
||||
'Tier Two A',
|
||||
'Tier Two B',
|
||||
'Tier Three A',
|
||||
'Tier Three B',
|
||||
'Tier Three C',
|
||||
'Tier Three D',
|
||||
'Tier Three E',
|
||||
'Tier Three F',
|
||||
'Tier Three G',
|
||||
'Tier Three H',
|
||||
])
|
||||
})
|
||||
|
||||
it('defines the approved columns and conservative narrow-mobile fallback', () => {
|
||||
expect([1, 2, 3].map((tier) => sponsorColumns(tier as 1 | 2 | 3, 'desktop'))).toEqual([2, 3, 4])
|
||||
expect([1, 2, 3].map((tier) => sponsorColumns(tier as 1 | 2 | 3, 'tablet'))).toEqual([2, 2, 3])
|
||||
expect([1, 2, 3].map((tier) => sponsorColumns(tier as 1 | 2 | 3, 'mobile'))).toEqual([1, 1, 2])
|
||||
expect([1, 2, 3].map((tier) => sponsorColumns(tier as 1 | 2 | 3, 'narrow-mobile'))).toEqual([1, 1, 1])
|
||||
expect(sponsorViewport({ isMobile: false, isNarrowMobile: false, isTabletOrMobile: true })).toBe('tablet')
|
||||
expect([1, 2, 3].map((tier) => sponsorColumns(tier as 1 | 2 | 3, 'narrow-mobile'))).toEqual([
|
||||
1, 1, 1,
|
||||
])
|
||||
expect(
|
||||
sponsorViewport({ isMobile: false, isNarrowMobile: false, isTabletOrMobile: true }),
|
||||
).toBe('tablet')
|
||||
expect(sponsorCardBasis(3, 16)).toBe('calc((100% - 32px) / 3)')
|
||||
})
|
||||
|
||||
@@ -140,7 +158,9 @@ describe('responsive sponsor hierarchy', () => {
|
||||
})
|
||||
expect(screen.getAllByText(sponsorCopy.detailLabel)).toHaveLength(partners.length)
|
||||
expect(screen.queryByText(netzwerkContent.partners.description)).toBeNull()
|
||||
netzwerkContent.partners.tiers.forEach(({ label }) => expect(screen.queryByText(label)).toBeNull())
|
||||
netzwerkContent.partners.tiers.forEach(({ label }) =>
|
||||
expect(screen.queryByText(label)).toBeNull(),
|
||||
)
|
||||
})
|
||||
|
||||
it.each([
|
||||
|
||||
48
tests/int/partners-admin-ordering.int.spec.ts
Normal file
48
tests/int/partners-admin-ordering.int.spec.ts
Normal file
@@ -0,0 +1,48 @@
|
||||
import type { Field, NumberField, NumberFieldSingleValidation } from 'payload'
|
||||
import { describe, expect, it } from 'vitest'
|
||||
|
||||
import { Partners } from '@/collections/Partners'
|
||||
|
||||
function partnerField(name: string): Field {
|
||||
const field = Partners.fields.find((candidate) => 'name' in candidate && candidate.name === name)
|
||||
if (!field) throw new Error(`Missing Partners field: ${name}`)
|
||||
return field
|
||||
}
|
||||
|
||||
describe('Partners admin ordering contract', () => {
|
||||
it('shows the title and ordering state needed for content operations', () => {
|
||||
expect(Partners.admin?.useAsTitle).toBe('name')
|
||||
expect(Partners.admin?.defaultColumns).toEqual([
|
||||
'name',
|
||||
'tier',
|
||||
'sortOrder',
|
||||
'_status',
|
||||
'active',
|
||||
'showOnHomepage',
|
||||
'updatedAt',
|
||||
])
|
||||
})
|
||||
|
||||
it('accepts only numeric tiers 1, 2, and 3', async () => {
|
||||
const tierField = partnerField('tier')
|
||||
|
||||
expect(tierField).toMatchObject({
|
||||
type: 'number',
|
||||
min: 1,
|
||||
max: 3,
|
||||
required: true,
|
||||
admin: { step: 1 },
|
||||
})
|
||||
|
||||
const validate = (tierField as NumberField).validate as NumberFieldSingleValidation | undefined
|
||||
expect(validate).toBeTypeOf('function')
|
||||
|
||||
for (const value of [1, 2, 3]) {
|
||||
expect(await validate?.(value, {} as never)).toBe(true)
|
||||
}
|
||||
|
||||
for (const value of [0, 1.5, 4, Number.NaN, null, undefined]) {
|
||||
expect(await validate?.(value, {} as never)).toBe('Tier must be one of 1, 2, or 3.')
|
||||
}
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user