2022-09-24 16:20:54 +08:00
import { queryByTestId } from "@testing-library/dom" ;
import "@testing-library/jest-dom" ;
import { cssToObject } from "@uppercod/css-to-object" ;
2022-09-24 20:10:06 +08:00
import { renderRepoCard } from "../src/cards/repo-card.js" ;
2023-07-03 14:54:19 +08:00
import { expect , it , describe } from "@jest/globals" ;
2020-07-12 00:40:13 +08:00
2022-09-24 19:20:52 +08:00
import { themes } from "../themes/index.js" ;
2020-07-12 00:40:13 +08:00
const data _repo = {
repository : {
2020-07-16 20:33:33 +08:00
nameWithOwner : "anuraghazra/convoychat" ,
2020-07-12 00:40:13 +08:00
name : "convoychat" ,
description : "Help us take over the world! React + TS + GraphQL Chat App" ,
primaryLanguage : {
color : "#2b7489" ,
id : "MDg6TGFuZ3VhZ2UyODc=" ,
name : "TypeScript" ,
} ,
2021-09-26 23:32:27 +08:00
starCount : 38000 ,
2020-07-12 00:40:13 +08:00
forkCount : 100 ,
} ,
} ;
describe ( "Test renderRepoCard" , ( ) => {
it ( "should render correctly" , ( ) => {
document . body . innerHTML = renderRepoCard ( data _repo . repository ) ;
2020-07-16 20:33:33 +08:00
const [ header ] = document . getElementsByClassName ( "header" ) ;
expect ( header ) . toHaveTextContent ( "convoychat" ) ;
expect ( header ) . not . toHaveTextContent ( "anuraghazra" ) ;
2020-07-12 00:40:13 +08:00
expect ( document . getElementsByClassName ( "description" ) [ 0 ] ) . toHaveTextContent (
2020-09-25 00:08:14 +08:00
"Help us take over the world! React + TS + GraphQL Chat App" ,
2020-07-12 00:40:13 +08:00
) ;
expect ( queryByTestId ( document . body , "stargazers" ) ) . toHaveTextContent ( "38k" ) ;
expect ( queryByTestId ( document . body , "forkcount" ) ) . toHaveTextContent ( "100" ) ;
2020-07-23 16:11:37 +08:00
expect ( queryByTestId ( document . body , "lang-name" ) ) . toHaveTextContent (
2020-09-25 00:08:14 +08:00
"TypeScript" ,
2020-07-12 00:40:13 +08:00
) ;
expect ( queryByTestId ( document . body , "lang-color" ) ) . toHaveAttribute (
"fill" ,
2020-09-25 00:08:14 +08:00
"#2b7489" ,
2020-07-12 00:40:13 +08:00
) ;
} ) ;
2020-07-16 20:33:33 +08:00
it ( "should display username in title (full repo name)" , ( ) => {
document . body . innerHTML = renderRepoCard ( data _repo . repository , {
show _owner : true ,
} ) ;
expect ( document . getElementsByClassName ( "header" ) [ 0 ] ) . toHaveTextContent (
2020-09-25 00:08:14 +08:00
"anuraghazra/convoychat" ,
2020-07-16 20:33:33 +08:00
) ;
} ) ;
2021-10-18 21:41:50 +08:00
it ( "should trim header" , ( ) => {
document . body . innerHTML = renderRepoCard ( {
... data _repo . repository ,
name : "some-really-long-repo-name-for-test-purposes" ,
} ) ;
expect ( document . getElementsByClassName ( "header" ) [ 0 ] . textContent ) . toBe (
"some-really-long-repo-name-for-test..." ,
) ;
} ) ;
2020-07-12 00:40:13 +08:00
it ( "should trim description" , ( ) => {
document . body . innerHTML = renderRepoCard ( {
... data _repo . repository ,
description :
2020-07-27 16:39:35 +08:00
"The quick brown fox jumps over the lazy dog is an English-language pangram—a sentence that contains all of the letters of the English alphabet" ,
2020-07-12 00:40:13 +08:00
} ) ;
2020-07-27 16:39:35 +08:00
expect (
2020-09-25 00:08:14 +08:00
document . getElementsByClassName ( "description" ) [ 0 ] . children [ 0 ] . textContent ,
2020-07-27 16:39:35 +08:00
) . toBe ( "The quick brown fox jumps over the lazy dog is an" ) ;
expect (
2020-09-25 00:08:14 +08:00
document . getElementsByClassName ( "description" ) [ 0 ] . children [ 1 ] . textContent ,
2020-07-27 16:39:35 +08:00
) . toBe ( "English-language pangram—a sentence that contains all" ) ;
2020-07-12 00:40:13 +08:00
// Should not trim
document . body . innerHTML = renderRepoCard ( {
... data _repo . repository ,
description : "Small text should not trim" ,
} ) ;
expect ( document . getElementsByClassName ( "description" ) [ 0 ] ) . toHaveTextContent (
2020-09-25 00:08:14 +08:00
"Small text should not trim" ,
2020-07-12 00:40:13 +08:00
) ;
} ) ;
2020-07-24 21:26:26 +08:00
it ( "should render emojis" , ( ) => {
document . body . innerHTML = renderRepoCard ( {
... data _repo . repository ,
description : "This is a text with a :poop: poo emoji" ,
} ) ;
// poop emoji may not show in all editors but it's there between "a" and "poo"
expect ( document . getElementsByClassName ( "description" ) [ 0 ] ) . toHaveTextContent (
2020-09-25 00:08:14 +08:00
"This is a text with a 💩 poo emoji" ,
2020-07-24 21:26:26 +08:00
) ;
} ) ;
2020-07-23 16:11:37 +08:00
it ( "should hide language if primaryLanguage is null & fallback to correct values" , ( ) => {
document . body . innerHTML = renderRepoCard ( {
... data _repo . repository ,
primaryLanguage : null ,
} ) ;
expect ( queryByTestId ( document . body , "primary-lang" ) ) . toBeNull ( ) ;
document . body . innerHTML = renderRepoCard ( {
... data _repo . repository ,
primaryLanguage : { color : null , name : null } ,
} ) ;
expect ( queryByTestId ( document . body , "primary-lang" ) ) . toBeInTheDocument ( ) ;
expect ( queryByTestId ( document . body , "lang-color" ) ) . toHaveAttribute (
"fill" ,
2020-09-25 00:08:14 +08:00
"#333" ,
2020-07-23 16:11:37 +08:00
) ;
expect ( queryByTestId ( document . body , "lang-name" ) ) . toHaveTextContent (
2020-09-25 00:08:14 +08:00
"Unspecified" ,
2020-07-23 16:11:37 +08:00
) ;
} ) ;
2020-07-12 15:16:08 +08:00
it ( "should render default colors properly" , ( ) => {
document . body . innerHTML = renderRepoCard ( data _repo . repository ) ;
const styleTag = document . querySelector ( "style" ) ;
const stylesObject = cssToObject ( styleTag . innerHTML ) ;
2021-12-13 22:42:03 +08:00
const headerClassStyles = stylesObject [ ":host" ] [ ".header " ] ;
const descClassStyles = stylesObject [ ":host" ] [ ".description " ] ;
const iconClassStyles = stylesObject [ ":host" ] [ ".icon " ] ;
2020-07-12 15:16:08 +08:00
2021-12-13 22:42:03 +08:00
expect ( headerClassStyles . fill . trim ( ) ) . toBe ( "#2f80ed" ) ;
2022-03-01 03:49:34 +08:00
expect ( descClassStyles . fill . trim ( ) ) . toBe ( "#434d58" ) ;
2021-12-13 22:42:03 +08:00
expect ( iconClassStyles . fill . trim ( ) ) . toBe ( "#586069" ) ;
2020-07-19 23:04:41 +08:00
expect ( queryByTestId ( document . body , "card-bg" ) ) . toHaveAttribute (
2020-07-12 15:16:08 +08:00
"fill" ,
2020-09-25 00:08:14 +08:00
"#fffefe" ,
2020-07-12 15:16:08 +08:00
) ;
} ) ;
it ( "should render custom colors properly" , ( ) => {
const customColors = {
title _color : "5a0" ,
icon _color : "1b998b" ,
text _color : "9991" ,
bg _color : "252525" ,
} ;
document . body . innerHTML = renderRepoCard ( data _repo . repository , {
... customColors ,
} ) ;
const styleTag = document . querySelector ( "style" ) ;
const stylesObject = cssToObject ( styleTag . innerHTML ) ;
2021-12-13 22:42:03 +08:00
const headerClassStyles = stylesObject [ ":host" ] [ ".header " ] ;
const descClassStyles = stylesObject [ ":host" ] [ ".description " ] ;
const iconClassStyles = stylesObject [ ":host" ] [ ".icon " ] ;
2020-07-12 15:16:08 +08:00
2021-12-13 22:42:03 +08:00
expect ( headerClassStyles . fill . trim ( ) ) . toBe ( ` # ${ customColors . title _color } ` ) ;
expect ( descClassStyles . fill . trim ( ) ) . toBe ( ` # ${ customColors . text _color } ` ) ;
expect ( iconClassStyles . fill . trim ( ) ) . toBe ( ` # ${ customColors . icon _color } ` ) ;
2020-07-19 23:04:41 +08:00
expect ( queryByTestId ( document . body , "card-bg" ) ) . toHaveAttribute (
2020-07-12 15:16:08 +08:00
"fill" ,
2020-09-25 00:08:14 +08:00
"#252525" ,
2020-07-12 15:16:08 +08:00
) ;
} ) ;
2020-07-18 22:50:36 +08:00
2020-07-21 15:45:53 +08:00
it ( "should render with all the themes" , ( ) => {
Object . keys ( themes ) . forEach ( ( name ) => {
document . body . innerHTML = renderRepoCard ( data _repo . repository , {
theme : name ,
} ) ;
const styleTag = document . querySelector ( "style" ) ;
const stylesObject = cssToObject ( styleTag . innerHTML ) ;
2021-12-13 22:42:03 +08:00
const headerClassStyles = stylesObject [ ":host" ] [ ".header " ] ;
const descClassStyles = stylesObject [ ":host" ] [ ".description " ] ;
const iconClassStyles = stylesObject [ ":host" ] [ ".icon " ] ;
2020-07-21 15:45:53 +08:00
2021-12-13 22:42:03 +08:00
expect ( headerClassStyles . fill . trim ( ) ) . toBe (
` # ${ themes [ name ] . title _color } ` ,
) ;
expect ( descClassStyles . fill . trim ( ) ) . toBe ( ` # ${ themes [ name ] . text _color } ` ) ;
expect ( iconClassStyles . fill . trim ( ) ) . toBe ( ` # ${ themes [ name ] . icon _color } ` ) ;
2023-10-23 17:31:30 +08:00
const backgroundElement = queryByTestId ( document . body , "card-bg" ) ;
const backgroundElementFill = backgroundElement . getAttribute ( "fill" ) ;
expect ( [ ` # ${ themes [ name ] . bg _color } ` , "url(#gradient)" ] ) . toContain (
backgroundElementFill ,
2020-07-21 15:45:53 +08:00
) ;
} ) ;
} ) ;
2020-07-19 23:04:41 +08:00
it ( "should render custom colors with themes" , ( ) => {
document . body . innerHTML = renderRepoCard ( data _repo . repository , {
title _color : "5a0" ,
theme : "radical" ,
} ) ;
const styleTag = document . querySelector ( "style" ) ;
const stylesObject = cssToObject ( styleTag . innerHTML ) ;
2021-12-13 22:42:03 +08:00
const headerClassStyles = stylesObject [ ":host" ] [ ".header " ] ;
const descClassStyles = stylesObject [ ":host" ] [ ".description " ] ;
const iconClassStyles = stylesObject [ ":host" ] [ ".icon " ] ;
2020-07-19 23:04:41 +08:00
2021-12-13 22:42:03 +08:00
expect ( headerClassStyles . fill . trim ( ) ) . toBe ( "#5a0" ) ;
expect ( descClassStyles . fill . trim ( ) ) . toBe ( ` # ${ themes . radical . text _color } ` ) ;
expect ( iconClassStyles . fill . trim ( ) ) . toBe ( ` # ${ themes . radical . icon _color } ` ) ;
2020-07-19 23:04:41 +08:00
expect ( queryByTestId ( document . body , "card-bg" ) ) . toHaveAttribute (
"fill" ,
2020-09-25 00:08:14 +08:00
` # ${ themes . radical . bg _color } ` ,
2020-07-19 23:04:41 +08:00
) ;
} ) ;
it ( "should render custom colors with themes and fallback to default colors if invalid" , ( ) => {
document . body . innerHTML = renderRepoCard ( data _repo . repository , {
title _color : "invalid color" ,
text _color : "invalid color" ,
theme : "radical" ,
} ) ;
const styleTag = document . querySelector ( "style" ) ;
const stylesObject = cssToObject ( styleTag . innerHTML ) ;
2021-12-13 22:42:03 +08:00
const headerClassStyles = stylesObject [ ":host" ] [ ".header " ] ;
const descClassStyles = stylesObject [ ":host" ] [ ".description " ] ;
const iconClassStyles = stylesObject [ ":host" ] [ ".icon " ] ;
2020-07-19 23:04:41 +08:00
2021-12-13 22:42:03 +08:00
expect ( headerClassStyles . fill . trim ( ) ) . toBe (
` # ${ themes . default . title _color } ` ,
) ;
expect ( descClassStyles . fill . trim ( ) ) . toBe ( ` # ${ themes . default . text _color } ` ) ;
expect ( iconClassStyles . fill . trim ( ) ) . toBe ( ` # ${ themes . radical . icon _color } ` ) ;
2020-07-19 23:04:41 +08:00
expect ( queryByTestId ( document . body , "card-bg" ) ) . toHaveAttribute (
"fill" ,
2020-09-25 00:08:14 +08:00
` # ${ themes . radical . bg _color } ` ,
2020-07-19 23:04:41 +08:00
) ;
} ) ;
2020-07-19 01:14:27 +08:00
it ( "should not render star count or fork count if either of the are zero" , ( ) => {
document . body . innerHTML = renderRepoCard ( {
... data _repo . repository ,
2021-09-26 23:32:27 +08:00
starCount : 0 ,
2020-07-19 01:14:27 +08:00
} ) ;
expect ( queryByTestId ( document . body , "stargazers" ) ) . toBeNull ( ) ;
2020-07-23 15:35:50 +08:00
expect ( queryByTestId ( document . body , "forkcount" ) ) . toBeInTheDocument ( ) ;
2020-07-19 01:14:27 +08:00
document . body . innerHTML = renderRepoCard ( {
... data _repo . repository ,
2021-09-26 23:32:27 +08:00
starCount : 1 ,
2020-07-19 01:14:27 +08:00
forkCount : 0 ,
} ) ;
2020-07-23 15:35:50 +08:00
expect ( queryByTestId ( document . body , "stargazers" ) ) . toBeInTheDocument ( ) ;
2020-07-19 01:14:27 +08:00
expect ( queryByTestId ( document . body , "forkcount" ) ) . toBeNull ( ) ;
2020-07-19 23:04:41 +08:00
2020-07-19 01:14:27 +08:00
document . body . innerHTML = renderRepoCard ( {
... data _repo . repository ,
2021-09-26 23:32:27 +08:00
starCount : 0 ,
2020-07-19 01:14:27 +08:00
forkCount : 0 ,
} ) ;
expect ( queryByTestId ( document . body , "stargazers" ) ) . toBeNull ( ) ;
expect ( queryByTestId ( document . body , "forkcount" ) ) . toBeNull ( ) ;
} ) ;
2020-07-23 15:35:50 +08:00
it ( "should render badges" , ( ) => {
document . body . innerHTML = renderRepoCard ( {
... data _repo . repository ,
isArchived : true ,
} ) ;
expect ( queryByTestId ( document . body , "badge" ) ) . toHaveTextContent ( "Archived" ) ;
document . body . innerHTML = renderRepoCard ( {
... data _repo . repository ,
isTemplate : true ,
} ) ;
expect ( queryByTestId ( document . body , "badge" ) ) . toHaveTextContent ( "Template" ) ;
} ) ;
it ( "should not render template" , ( ) => {
document . body . innerHTML = renderRepoCard ( {
... data _repo . repository ,
} ) ;
expect ( queryByTestId ( document . body , "badge" ) ) . toBeNull ( ) ;
} ) ;
2020-10-04 16:05:15 +08:00
it ( "should render translated badges" , ( ) => {
document . body . innerHTML = renderRepoCard (
{
... data _repo . repository ,
isArchived : true ,
} ,
{
locale : "cn" ,
} ,
) ;
2020-10-04 22:47:13 +08:00
expect ( queryByTestId ( document . body , "badge" ) ) . toHaveTextContent ( "已归档" ) ;
2020-10-04 16:05:15 +08:00
document . body . innerHTML = renderRepoCard (
{
... data _repo . repository ,
isTemplate : true ,
} ,
{
locale : "cn" ,
} ,
) ;
expect ( queryByTestId ( document . body , "badge" ) ) . toHaveTextContent ( "模板" ) ;
} ) ;
2021-09-19 01:09:28 +08:00
2021-03-08 00:53:32 +08:00
it ( "should render without rounding" , ( ) => {
2021-09-19 01:09:28 +08:00
document . body . innerHTML = renderRepoCard ( data _repo . repository , {
border _radius : "0" ,
} ) ;
2021-03-08 00:53:32 +08:00
expect ( document . querySelector ( "rect" ) ) . toHaveAttribute ( "rx" , "0" ) ;
2021-09-19 01:09:28 +08:00
document . body . innerHTML = renderRepoCard ( data _repo . repository , { } ) ;
2021-03-08 00:53:32 +08:00
expect ( document . querySelector ( "rect" ) ) . toHaveAttribute ( "rx" , "4.5" ) ;
} ) ;
2021-09-26 23:32:27 +08:00
it ( "should fallback to default description" , ( ) => {
document . body . innerHTML = renderRepoCard ( {
... data _repo . repository ,
description : undefined ,
isArchived : true ,
} ) ;
expect ( document . getElementsByClassName ( "description" ) [ 0 ] ) . toHaveTextContent (
"No description provided" ,
) ;
} ) ;
2023-11-21 02:08:48 +08:00
it ( "should have correct height with specified `description_lines_count` parameter" , ( ) => {
// Testing short description
document . body . innerHTML = renderRepoCard ( data _repo . repository , {
description _lines _count : 1 ,
} ) ;
expect ( document . querySelector ( "svg" ) ) . toHaveAttribute ( "height" , "120" ) ;
document . body . innerHTML = renderRepoCard ( data _repo . repository , {
description _lines _count : 3 ,
} ) ;
expect ( document . querySelector ( "svg" ) ) . toHaveAttribute ( "height" , "150" ) ;
// Testing long description
const longDescription =
"A tool that will make a lot of iPhone/iPad developers' life easier. It shares your app over-the-air in a WiFi network. Bonjour is used and no configuration is needed." ;
document . body . innerHTML = renderRepoCard (
{ ... data _repo . repository , description : longDescription } ,
{
description _lines _count : 3 ,
} ,
) ;
expect ( document . querySelector ( "svg" ) ) . toHaveAttribute ( "height" , "150" ) ;
document . body . innerHTML = renderRepoCard (
{ ... data _repo . repository , description : longDescription } ,
{
description _lines _count : 1 ,
} ,
) ;
expect ( document . querySelector ( "svg" ) ) . toHaveAttribute ( "height" , "120" ) ;
} ) ;
2020-07-12 00:40:13 +08:00
} ) ;