Skip to content

test(shared): improve test coverage #8456

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Oct 14, 2024
Merged
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
142 changes: 141 additions & 1 deletion packages/shared/__tests__/normalizeProp.spec.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
import { normalizeClass, parseStringStyle } from '../src'
import {
normalizeClass,
normalizeProps,
normalizeStyle,
parseStringStyle,
stringifyStyle,
} from '../src'

describe('normalizeClass', () => {
test('handles undefined correctly', () => {
Expand All @@ -15,6 +21,11 @@ describe('normalizeClass', () => {
)
})

test('handles string containing spaces correctly', () => {
expect(normalizeClass('foo1 ')).toEqual('foo1')
expect(normalizeClass(['foo ', ' baz '])).toEqual('foo baz')
})

test('handles empty array correctly', () => {
expect(normalizeClass([])).toEqual('')
})
Expand Down Expand Up @@ -92,3 +103,132 @@ describe('normalizeClass', () => {
`)
})
})

describe('normalizeStyle', () => {
test('handles string correctly', () => {
expect(normalizeStyle('foo')).toEqual('foo')
})

test('handles array correctly', () => {
const style: any = normalizeStyle([
`border: 1px solid transparent;
background: linear-gradient(white, white) padding-box,
repeating-linear-gradient(
-45deg,
#ccc 0,
#ccc 0.5em,
white 0,
white 0.75em
);`,
])

expect(style.border).toEqual('1px solid transparent')

expect(style.background).toEqual(`linear-gradient(white, white) padding-box,
repeating-linear-gradient(
-45deg,
#ccc 0,
#ccc 0.5em,
white 0,
white 0.75em
)`)
})

test('handles object correctly', () => {
const styleObj = {
border: '1px solid transparent',
background: `linear-gradient(white, white) padding-box,
repeating-linear-gradient(
-45deg,
#ccc 0,
#ccc 0.5em,
white 0,
white 0.75em
)`,
}
const style: any = normalizeStyle(styleObj)
expect(style.border).toEqual(styleObj.border)
expect(style.background).toEqual(styleObj.background)
})
})

describe('stringifyStyle', () => {
test('should return empty string for undefined or string styles', () => {
expect(stringifyStyle(undefined)).toBe('')
expect(stringifyStyle('')).toBe('')
expect(stringifyStyle('color: blue;')).toBe('')
})

test('should return valid CSS string for normalized style object', () => {
const style = {
color: 'blue',
fontSize: '14px',
backgroundColor: 'white',
opacity: 0.8,
margin: 0,
'--custom-color': 'red',
}

expect(stringifyStyle(style)).toBe(
'color:blue;font-size:14px;background-color:white;opacity:0.8;margin:0;--custom-color:red;',
)
})

test('should ignore non-string or non-number values in style object', () => {
const style: any = {
color: 'blue',
fontSize: '14px',
lineHeight: true,
padding: null,
margin: undefined,
}

const expected = 'color:blue;font-size:14px;'
expect(stringifyStyle(style)).toBe(expected)
})
})

describe('normalizeProps', () => {
test('should return null when props is null', () => {
const props = null
const result = normalizeProps(props)
expect(result).toBeNull()
})

test('should normalize class prop when it is an array', () => {
const props = {
class: ['class1', 'class2'],
}
const result = normalizeProps(props)
expect(result).toEqual({
class: 'class1 class2',
})
})

test('should normalize class prop when it is an object', () => {
const props = {
class: {
class1: true,
class2: false,
class3: true,
},
}
const result = normalizeProps(props)
expect(result).toEqual({
class: 'class1 class3',
})
})

test('should normalize style prop', () => {
const props = {
style: ['color: blue', 'font-size: 14px'],
}
const result = normalizeProps(props)
expect(result).toEqual({
style: {
color: 'blue',
'font-size': '14px',
},
})
})
})