2025-08-03 20:59:09 +02:00
<!DOCTYPE html>
< html lang = "en" >
< head >
< meta charset = "UTF-8" >
< title > Code Coverage for /var/www/html/backend/app/Models/Article.php< / title >
< meta name = "viewport" content = "width=device-width, initial-scale=1.0" >
< link href = "../_css/bootstrap.min.css?v=11.0.10" rel = "stylesheet" type = "text/css" >
< link href = "../_css/octicons.css?v=11.0.10" rel = "stylesheet" type = "text/css" >
< link href = "../_css/style.css?v=11.0.10" rel = "stylesheet" type = "text/css" >
< link href = "../_css/custom.css" rel = "stylesheet" type = "text/css" >
< / head >
< body >
< header >
< div class = "container-fluid" >
< div class = "row" >
< div class = "col-md-12" >
< nav aria-label = "breadcrumb" >
< ol class = "breadcrumb" >
< li class = "breadcrumb-item" > < a href = "../index.html" > /var/www/html/backend/app< / a > < / li >
< li class = "breadcrumb-item" > < a href = "index.html" > Models< / a > < / li >
< li class = "breadcrumb-item active" > Article.php< / li >
< / ol >
< / nav >
< / div >
< / div >
< / div >
< / header >
< div class = "container-fluid" >
< div class = "table-responsive" >
< table class = "table table-bordered" >
< thead >
< tr >
< td > < / td >
< td colspan = "10" > < div align = "center" > < strong > Code Coverage< / strong > < / div > < / td >
< / tr >
< tr >
< td > < / td >
< td colspan = "3" > < div align = "center" > < strong > Lines< / strong > < / div > < / td >
< td colspan = "4" > < div align = "center" > < strong > Functions and Methods< / strong > < / div > < / td >
< td colspan = "3" > < div align = "center" > < strong > Classes and Traits< / strong > < / div > < / td >
< / tr >
< / thead >
< tbody >
< tr >
2025-08-03 21:16:59 +02:00
< td class = "success" > Total< / td >
< td class = "success big" > < div class = "progress" >
< div class = "progress-bar bg-success" role = "progressbar" aria-valuenow = "100.00" aria-valuemin = "0" aria-valuemax = "100" style = "width: 100.00%" >
< span class = "visually-hidden" > 100.00% covered (success)< / span >
2025-08-03 20:59:09 +02:00
< / div >
< / div >
< / td >
2025-08-03 21:16:59 +02:00
< td class = "success small" > < div align = "right" > 100.00%< / div > < / td >
< td class = "success small" > < div align = "right" > 39 / 39< / div > < / td >
< td class = "success big" > < div class = "progress" >
< div class = "progress-bar bg-success" role = "progressbar" aria-valuenow = "100.00" aria-valuemin = "0" aria-valuemax = "100" style = "width: 100.00%" >
< span class = "visually-hidden" > 100.00% covered (success)< / span >
2025-08-03 20:59:09 +02:00
< / div >
< / div >
< / td >
2025-08-03 21:16:59 +02:00
< td class = "success small" > < div align = "right" > 100.00%< / div > < / td >
< td class = "success small" > < div align = "right" > 11 / 11< / div > < / td >
< td class = "success small" > < abbr title = "Change Risk Anti-Patterns (CRAP) Index" > CRAP< / abbr > < / td >
< td class = "success big" > < div class = "progress" >
< div class = "progress-bar bg-success" role = "progressbar" aria-valuenow = "100.00" aria-valuemin = "0" aria-valuemax = "100" style = "width: 100.00%" >
< span class = "visually-hidden" > 100.00% covered (success)< / span >
2025-08-03 20:59:09 +02:00
< / div >
< / div >
< / td >
2025-08-03 21:16:59 +02:00
< td class = "success small" > < div align = "right" > 100.00%< / div > < / td >
< td class = "success small" > < div align = "right" > 1 / 1< / div > < / td >
2025-08-03 20:59:09 +02:00
< / tr >
< tr >
2025-08-03 21:16:59 +02:00
< td class = "success" > < abbr title = "App\Models\Article" > Article< / abbr > < / td >
< td class = "success big" > < div class = "progress" >
< div class = "progress-bar bg-success" role = "progressbar" aria-valuenow = "100.00" aria-valuemin = "0" aria-valuemax = "100" style = "width: 100.00%" >
< span class = "visually-hidden" > 100.00% covered (success)< / span >
2025-08-03 20:59:09 +02:00
< / div >
< / div >
< / td >
2025-08-03 21:16:59 +02:00
< td class = "success small" > < div align = "right" > 100.00%< / div > < / td >
< td class = "success small" > < div align = "right" > 39 / 39< / div > < / td >
< td class = "success big" > < div class = "progress" >
< div class = "progress-bar bg-success" role = "progressbar" aria-valuenow = "100.00" aria-valuemin = "0" aria-valuemax = "100" style = "width: 100.00%" >
< span class = "visually-hidden" > 100.00% covered (success)< / span >
2025-08-03 20:59:09 +02:00
< / div >
< / div >
< / td >
2025-08-03 21:16:59 +02:00
< td class = "success small" > < div align = "right" > 100.00%< / div > < / td >
< td class = "success small" > < div align = "right" > 11 / 11< / div > < / td >
< td class = "success small" > 15< / td >
< td class = "success big" > < div class = "progress" >
< div class = "progress-bar bg-success" role = "progressbar" aria-valuenow = "100.00" aria-valuemin = "0" aria-valuemax = "100" style = "width: 100.00%" >
< span class = "visually-hidden" > 100.00% covered (success)< / span >
2025-08-03 20:59:09 +02:00
< / div >
< / div >
< / td >
2025-08-03 21:16:59 +02:00
< td class = "success small" > < div align = "right" > 100.00%< / div > < / td >
< td class = "success small" > < div align = "right" > 1 / 1< / div > < / td >
2025-08-03 20:59:09 +02:00
< / tr >
< tr >
< td class = "success" > < a href = "#50" > < abbr title = "casts(): array" > casts< / abbr > < / a > < / td >
< td class = "success big" > < div class = "progress" >
< div class = "progress-bar bg-success" role = "progressbar" aria-valuenow = "100.00" aria-valuemin = "0" aria-valuemax = "100" style = "width: 100.00%" >
< span class = "visually-hidden" > 100.00% covered (success)< / span >
< / div >
< / div >
< / td >
< td class = "success small" > < div align = "right" > 100.00%< / div > < / td >
< td class = "success small" > < div align = "right" > 10 / 10< / div > < / td >
< td class = "success big" > < div class = "progress" >
< div class = "progress-bar bg-success" role = "progressbar" aria-valuenow = "100.00" aria-valuemin = "0" aria-valuemax = "100" style = "width: 100.00%" >
< span class = "visually-hidden" > 100.00% covered (success)< / span >
< / div >
< / div >
< / td >
< td class = "success small" > < div align = "right" > 100.00%< / div > < / td >
< td class = "success small" > < div align = "right" > 1 / 1< / div > < / td >
< td class = "success small" > 1< / td >
< td class = "success" colspan = "3" > < / td >
< / tr >
< tr >
2025-08-03 21:16:59 +02:00
< td class = "success" > < a href = "#64" > < abbr title = "isValid(): bool" > isValid< / abbr > < / a > < / td >
< td class = "success big" > < div class = "progress" >
< div class = "progress-bar bg-success" role = "progressbar" aria-valuenow = "100.00" aria-valuemin = "0" aria-valuemax = "100" style = "width: 100.00%" >
< span class = "visually-hidden" > 100.00% covered (success)< / span >
2025-08-03 20:59:09 +02:00
< / div >
< / div >
< / td >
2025-08-03 21:16:59 +02:00
< td class = "success small" > < div align = "right" > 100.00%< / div > < / td >
< td class = "success small" > < div align = "right" > 5 / 5< / div > < / td >
< td class = "success big" > < div class = "progress" >
< div class = "progress-bar bg-success" role = "progressbar" aria-valuenow = "100.00" aria-valuemin = "0" aria-valuemax = "100" style = "width: 100.00%" >
< span class = "visually-hidden" > 100.00% covered (success)< / span >
2025-08-03 20:59:09 +02:00
< / div >
< / div >
< / td >
2025-08-03 21:16:59 +02:00
< td class = "success small" > < div align = "right" > 100.00%< / div > < / td >
< td class = "success small" > < div align = "right" > 1 / 1< / div > < / td >
< td class = "success small" > 3< / td >
< td class = "success" colspan = "3" > < / td >
2025-08-03 20:59:09 +02:00
< / tr >
< tr >
< td class = "success" > < a href = "#77" > < abbr title = "isApproved(): bool" > isApproved< / abbr > < / a > < / td >
< td class = "success big" > < div class = "progress" >
< div class = "progress-bar bg-success" role = "progressbar" aria-valuenow = "100.00" aria-valuemin = "0" aria-valuemax = "100" style = "width: 100.00%" >
< span class = "visually-hidden" > 100.00% covered (success)< / span >
< / div >
< / div >
< / td >
< td class = "success small" > < div align = "right" > 100.00%< / div > < / td >
< td class = "success small" > < div align = "right" > 1 / 1< / div > < / td >
< td class = "success big" > < div class = "progress" >
< div class = "progress-bar bg-success" role = "progressbar" aria-valuenow = "100.00" aria-valuemin = "0" aria-valuemax = "100" style = "width: 100.00%" >
< span class = "visually-hidden" > 100.00% covered (success)< / span >
< / div >
< / div >
< / td >
< td class = "success small" > < div align = "right" > 100.00%< / div > < / td >
< td class = "success small" > < div align = "right" > 1 / 1< / div > < / td >
< td class = "success small" > 1< / td >
< td class = "success" colspan = "3" > < / td >
< / tr >
< tr >
2025-08-03 21:16:59 +02:00
< td class = "success" > < a href = "#82" > < abbr title = "isPending(): bool" > isPending< / abbr > < / a > < / td >
< td class = "success big" > < div class = "progress" >
< div class = "progress-bar bg-success" role = "progressbar" aria-valuenow = "100.00" aria-valuemin = "0" aria-valuemax = "100" style = "width: 100.00%" >
< span class = "visually-hidden" > 100.00% covered (success)< / span >
2025-08-03 20:59:09 +02:00
< / div >
< / div >
< / td >
2025-08-03 21:16:59 +02:00
< td class = "success small" > < div align = "right" > 100.00%< / div > < / td >
< td class = "success small" > < div align = "right" > 1 / 1< / div > < / td >
< td class = "success big" > < div class = "progress" >
< div class = "progress-bar bg-success" role = "progressbar" aria-valuenow = "100.00" aria-valuemin = "0" aria-valuemax = "100" style = "width: 100.00%" >
< span class = "visually-hidden" > 100.00% covered (success)< / span >
2025-08-03 20:59:09 +02:00
< / div >
< / div >
< / td >
2025-08-03 21:16:59 +02:00
< td class = "success small" > < div align = "right" > 100.00%< / div > < / td >
< td class = "success small" > < div align = "right" > 1 / 1< / div > < / td >
< td class = "success small" > 1< / td >
< td class = "success" colspan = "3" > < / td >
2025-08-03 20:59:09 +02:00
< / tr >
< tr >
2025-08-03 21:16:59 +02:00
< td class = "success" > < a href = "#87" > < abbr title = "isRejected(): bool" > isRejected< / abbr > < / a > < / td >
< td class = "success big" > < div class = "progress" >
< div class = "progress-bar bg-success" role = "progressbar" aria-valuenow = "100.00" aria-valuemin = "0" aria-valuemax = "100" style = "width: 100.00%" >
< span class = "visually-hidden" > 100.00% covered (success)< / span >
2025-08-03 20:59:09 +02:00
< / div >
< / div >
< / td >
2025-08-03 21:16:59 +02:00
< td class = "success small" > < div align = "right" > 100.00%< / div > < / td >
< td class = "success small" > < div align = "right" > 1 / 1< / div > < / td >
< td class = "success big" > < div class = "progress" >
< div class = "progress-bar bg-success" role = "progressbar" aria-valuenow = "100.00" aria-valuemin = "0" aria-valuemax = "100" style = "width: 100.00%" >
< span class = "visually-hidden" > 100.00% covered (success)< / span >
2025-08-03 20:59:09 +02:00
< / div >
< / div >
< / td >
2025-08-03 21:16:59 +02:00
< td class = "success small" > < div align = "right" > 100.00%< / div > < / td >
< td class = "success small" > < div align = "right" > 1 / 1< / div > < / td >
< td class = "success small" > 1< / td >
< td class = "success" colspan = "3" > < / td >
2025-08-03 20:59:09 +02:00
< / tr >
< tr >
2025-08-03 21:16:59 +02:00
< td class = "success" > < a href = "#92" > < abbr title = "approve(string $approvedBy): void" > approve< / abbr > < / a > < / td >
< td class = "success big" > < div class = "progress" >
< div class = "progress-bar bg-success" role = "progressbar" aria-valuenow = "100.00" aria-valuemin = "0" aria-valuemax = "100" style = "width: 100.00%" >
< span class = "visually-hidden" > 100.00% covered (success)< / span >
2025-08-03 20:59:09 +02:00
< / div >
< / div >
< / td >
2025-08-03 21:16:59 +02:00
< td class = "success small" > < div align = "right" > 100.00%< / div > < / td >
< td class = "success small" > < div align = "right" > 6 / 6< / div > < / td >
< td class = "success big" > < div class = "progress" >
< div class = "progress-bar bg-success" role = "progressbar" aria-valuenow = "100.00" aria-valuemin = "0" aria-valuemax = "100" style = "width: 100.00%" >
< span class = "visually-hidden" > 100.00% covered (success)< / span >
2025-08-03 20:59:09 +02:00
< / div >
< / div >
< / td >
2025-08-03 21:16:59 +02:00
< td class = "success small" > < div align = "right" > 100.00%< / div > < / td >
< td class = "success small" > < div align = "right" > 1 / 1< / div > < / td >
< td class = "success small" > 1< / td >
< td class = "success" colspan = "3" > < / td >
2025-08-03 20:59:09 +02:00
< / tr >
< tr >
2025-08-03 21:16:59 +02:00
< td class = "success" > < a href = "#104" > < abbr title = "reject(string $rejectedBy): void" > reject< / abbr > < / a > < / td >
< td class = "success big" > < div class = "progress" >
< div class = "progress-bar bg-success" role = "progressbar" aria-valuenow = "100.00" aria-valuemin = "0" aria-valuemax = "100" style = "width: 100.00%" >
< span class = "visually-hidden" > 100.00% covered (success)< / span >
2025-08-03 20:59:09 +02:00
< / div >
< / div >
< / td >
2025-08-03 21:16:59 +02:00
< td class = "success small" > < div align = "right" > 100.00%< / div > < / td >
< td class = "success small" > < div align = "right" > 5 / 5< / div > < / td >
< td class = "success big" > < div class = "progress" >
< div class = "progress-bar bg-success" role = "progressbar" aria-valuenow = "100.00" aria-valuemin = "0" aria-valuemax = "100" style = "width: 100.00%" >
< span class = "visually-hidden" > 100.00% covered (success)< / span >
2025-08-03 20:59:09 +02:00
< / div >
< / div >
< / td >
2025-08-03 21:16:59 +02:00
< td class = "success small" > < div align = "right" > 100.00%< / div > < / td >
< td class = "success small" > < div align = "right" > 1 / 1< / div > < / td >
< td class = "success small" > 1< / td >
< td class = "success" colspan = "3" > < / td >
2025-08-03 20:59:09 +02:00
< / tr >
< tr >
2025-08-03 21:16:59 +02:00
< td class = "success" > < a href = "#113" > < abbr title = "canBePublished(): bool" > canBePublished< / abbr > < / a > < / td >
< td class = "success big" > < div class = "progress" >
< div class = "progress-bar bg-success" role = "progressbar" aria-valuenow = "100.00" aria-valuemin = "0" aria-valuemax = "100" style = "width: 100.00%" >
< span class = "visually-hidden" > 100.00% covered (success)< / span >
2025-08-03 20:59:09 +02:00
< / div >
< / div >
< / td >
2025-08-03 21:16:59 +02:00
< td class = "success small" > < div align = "right" > 100.00%< / div > < / td >
< td class = "success small" > < div align = "right" > 5 / 5< / div > < / td >
< td class = "success big" > < div class = "progress" >
< div class = "progress-bar bg-success" role = "progressbar" aria-valuenow = "100.00" aria-valuemin = "0" aria-valuemax = "100" style = "width: 100.00%" >
< span class = "visually-hidden" > 100.00% covered (success)< / span >
2025-08-03 20:59:09 +02:00
< / div >
< / div >
< / td >
2025-08-03 21:16:59 +02:00
< td class = "success small" > < div align = "right" > 100.00%< / div > < / td >
< td class = "success small" > < div align = "right" > 1 / 1< / div > < / td >
< td class = "success small" > 3< / td >
< td class = "success" colspan = "3" > < / td >
2025-08-03 20:59:09 +02:00
< / tr >
< tr >
< td class = "success" > < a href = "#131" > < abbr title = "articlePublication(): Illuminate\Database\Eloquent\Relations\HasOne" > articlePublication< / abbr > < / a > < / td >
< td class = "success big" > < div class = "progress" >
< div class = "progress-bar bg-success" role = "progressbar" aria-valuenow = "100.00" aria-valuemin = "0" aria-valuemax = "100" style = "width: 100.00%" >
< span class = "visually-hidden" > 100.00% covered (success)< / span >
< / div >
< / div >
< / td >
< td class = "success small" > < div align = "right" > 100.00%< / div > < / td >
< td class = "success small" > < div align = "right" > 1 / 1< / div > < / td >
< td class = "success big" > < div class = "progress" >
< div class = "progress-bar bg-success" role = "progressbar" aria-valuenow = "100.00" aria-valuemin = "0" aria-valuemax = "100" style = "width: 100.00%" >
< span class = "visually-hidden" > 100.00% covered (success)< / span >
< / div >
< / div >
< / td >
< td class = "success small" > < div align = "right" > 100.00%< / div > < / td >
< td class = "success small" > < div align = "right" > 1 / 1< / div > < / td >
< td class = "success small" > 1< / td >
< td class = "success" colspan = "3" > < / td >
< / tr >
< tr >
< td class = "success" > < a href = "#139" > < abbr title = "feed(): Illuminate\Database\Eloquent\Relations\BelongsTo" > feed< / abbr > < / a > < / td >
< td class = "success big" > < div class = "progress" >
< div class = "progress-bar bg-success" role = "progressbar" aria-valuenow = "100.00" aria-valuemin = "0" aria-valuemax = "100" style = "width: 100.00%" >
< span class = "visually-hidden" > 100.00% covered (success)< / span >
< / div >
< / div >
< / td >
< td class = "success small" > < div align = "right" > 100.00%< / div > < / td >
< td class = "success small" > < div align = "right" > 1 / 1< / div > < / td >
< td class = "success big" > < div class = "progress" >
< div class = "progress-bar bg-success" role = "progressbar" aria-valuenow = "100.00" aria-valuemin = "0" aria-valuemax = "100" style = "width: 100.00%" >
< span class = "visually-hidden" > 100.00% covered (success)< / span >
< / div >
< / div >
< / td >
< td class = "success small" > < div align = "right" > 100.00%< / div > < / td >
< td class = "success small" > < div align = "right" > 1 / 1< / div > < / td >
< td class = "success small" > 1< / td >
< td class = "success" colspan = "3" > < / td >
< / tr >
< tr >
< td class = "success" > < a href = "#144" > < abbr title = "booted(): void" > booted< / abbr > < / a > < / td >
< td class = "success big" > < div class = "progress" >
< div class = "progress-bar bg-success" role = "progressbar" aria-valuenow = "100.00" aria-valuemin = "0" aria-valuemax = "100" style = "width: 100.00%" >
< span class = "visually-hidden" > 100.00% covered (success)< / span >
< / div >
< / div >
< / td >
< td class = "success small" > < div align = "right" > 100.00%< / div > < / td >
< td class = "success small" > < div align = "right" > 3 / 3< / div > < / td >
< td class = "success big" > < div class = "progress" >
< div class = "progress-bar bg-success" role = "progressbar" aria-valuenow = "100.00" aria-valuemin = "0" aria-valuemax = "100" style = "width: 100.00%" >
< span class = "visually-hidden" > 100.00% covered (success)< / span >
< / div >
< / div >
< / td >
< td class = "success small" > < div align = "right" > 100.00%< / div > < / td >
< td class = "success small" > < div align = "right" > 1 / 1< / div > < / td >
< td class = "success small" > 1< / td >
< td class = "success" colspan = "3" > < / td >
< / tr >
< / tbody >
< / table >
< / div >
< table id = "code" class = "table table-borderless table-condensed" >
< tbody >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "1" href = "#1" > 1< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < ?php< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "2" href = "#2" > 2< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "3" href = "#3" > 3< / a > < / td > < td class = "col-11 codeLine" > < span class = "keyword" > namespace< / span > < span class = "default" > < / span > < span class = "default" > App\Models< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "4" href = "#4" > 4< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "5" href = "#5" > 5< / a > < / td > < td class = "col-11 codeLine" > < span class = "keyword" > use< / span > < span class = "default" > < / span > < span class = "default" > App\Events\ArticleApproved< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "6" href = "#6" > 6< / a > < / td > < td class = "col-11 codeLine" > < span class = "keyword" > use< / span > < span class = "default" > < / span > < span class = "default" > App\Events\NewArticleFetched< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "7" href = "#7" > 7< / a > < / td > < td class = "col-11 codeLine" > < span class = "keyword" > use< / span > < span class = "default" > < / span > < span class = "default" > Database\Factories\ArticleFactory< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "8" href = "#8" > 8< / a > < / td > < td class = "col-11 codeLine" > < span class = "keyword" > use< / span > < span class = "default" > < / span > < span class = "default" > Illuminate\Database\Eloquent\Factories\HasFactory< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "9" href = "#9" > 9< / a > < / td > < td class = "col-11 codeLine" > < span class = "keyword" > use< / span > < span class = "default" > < / span > < span class = "default" > Illuminate\Database\Eloquent\Model< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "10" href = "#10" > 10< / a > < / td > < td class = "col-11 codeLine" > < span class = "keyword" > use< / span > < span class = "default" > < / span > < span class = "default" > Illuminate\Database\Eloquent\Relations\BelongsTo< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "11" href = "#11" > 11< / a > < / td > < td class = "col-11 codeLine" > < span class = "keyword" > use< / span > < span class = "default" > < / span > < span class = "default" > Illuminate\Database\Eloquent\Relations\HasOne< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "12" href = "#12" > 12< / a > < / td > < td class = "col-11 codeLine" > < span class = "keyword" > use< / span > < span class = "default" > < / span > < span class = "default" > Illuminate\Support\Carbon< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "13" href = "#13" > 13< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "14" href = "#14" > 14< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > /**< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "15" href = "#15" > 15< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * @method static firstOrCreate(array< string, mixed> $array)< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "16" href = "#16" > 16< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * @method static where(string $string, string $url)< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "17" href = "#17" > 17< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * @method static create(array< string, mixed> $array)< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "18" href = "#18" > 18< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * @property integer $id< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "19" href = "#19" > 19< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * @property int $feed_id< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "20" href = "#20" > 20< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * @property Feed $feed< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "21" href = "#21" > 21< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * @property string $url< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "22" href = "#22" > 22< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * @property bool|null $is_valid< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "23" href = "#23" > 23< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * @property Carbon|null $validated_at< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "24" href = "#24" > 24< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * @property Carbon $created_at< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "25" href = "#25" > 25< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * @property Carbon $updated_at< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "26" href = "#26" > 26< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * @property ArticlePublication $articlePublication< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "27" href = "#27" > 27< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > */< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "28" href = "#28" > 28< / a > < / td > < td class = "col-11 codeLine" > < span class = "keyword" > class< / span > < span class = "default" > < / span > < span class = "default" > Article< / span > < span class = "default" > < / span > < span class = "keyword" > extends< / span > < span class = "default" > < / span > < span class = "default" > Model< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "29" href = "#29" > 29< / a > < / td > < td class = "col-11 codeLine" > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "30" href = "#30" > 30< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > /** @use HasFactory< ArticleFactory> */< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "31" href = "#31" > 31< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > use< / span > < span class = "default" > < / span > < span class = "default" > HasFactory< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "32" href = "#32" > 32< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "33" href = "#33" > 33< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > protected< / span > < span class = "default" > < / span > < span class = "default" > $fillable< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "keyword" > [< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "34" href = "#34" > 34< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'feed_id'< / span > < span class = "keyword" > ,< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "35" href = "#35" > 35< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'url'< / span > < span class = "keyword" > ,< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "36" href = "#36" > 36< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'title'< / span > < span class = "keyword" > ,< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "37" href = "#37" > 37< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'description'< / span > < span class = "keyword" > ,< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "38" href = "#38" > 38< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'is_valid'< / span > < span class = "keyword" > ,< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "39" href = "#39" > 39< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'is_duplicate'< / span > < span class = "keyword" > ,< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "40" href = "#40" > 40< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'approval_status'< / span > < span class = "keyword" > ,< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "41" href = "#41" > 41< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'approved_at'< / span > < span class = "keyword" > ,< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "42" href = "#42" > 42< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'approved_by'< / span > < span class = "keyword" > ,< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "43" href = "#43" > 43< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'fetched_at'< / span > < span class = "keyword" > ,< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "44" href = "#44" > 44< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'validated_at'< / span > < span class = "keyword" > ,< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "45" href = "#45" > 45< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > ]< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "46" href = "#46" > 46< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "47" href = "#47" > 47< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > /**< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "48" href = "#48" > 48< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * @return array< string, string> < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "49" href = "#49" > 49< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > */< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "50" href = "#50" > 50< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > public< / span > < span class = "default" > < / span > < span class = "keyword" > function< / span > < span class = "default" > < / span > < span class = "default" > casts< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < span class = "keyword" > :< / span > < span class = "default" > < / span > < span class = "keyword" > array< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "51" href = "#51" > 51< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
2025-08-03 21:16:59 +02:00
< tr class = "covered-by-large-tests popin d-flex" > < td data-bs-title = "82 tests cover line 52" data-bs-content = "<ul><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_false_when_validated_at_is_null</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_false_when_is_valid_is_null</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_false_when_is_valid_is_false</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_true_when_validated_and_valid</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_approved_returns_true_for_approved_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_approved_returns_false_for_non_approved_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_pending_returns_true_for_pending_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_rejected_returns_true_for_rejected_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_approve_updates_status_and_timestamps</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_approve_without_approved_by_parameter</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_reject_updates_status_and_timestamps</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_returns_false_for_invalid_article</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_requires_approval_when_approvals_enabled</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_returns_true_when_approvals_disabled</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_feed_relationship</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_article_creation_fires_new_article_fetched_event</li><li class = "covered-by-large-tests">Tests\Unit\Services\ArticleFetcherTest::test_fetch_article_data_returns_array</li><li class = "covered-by-large-tests">Tests\Unit\Services\ArticleFetcherTest::test_fetch_article_data_handles_invalid_url</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_returns_correct_structure</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_with_today_period</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_with_week_period</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_with_all_time_period</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_calculates_percentage_correctly</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_handles_zero_articles</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServiceTest::test_validate_returns_article_with_validation_status</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServiceTest::test_validate_marks_article_invalid_when_missing_data</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServiceTest::test_validate_with_supported_article_content</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServ
< tr class = "covered-by-large-tests popin d-flex" > < td data-bs-title = "82 tests cover line 53" data-bs-content = "<ul><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_false_when_validated_at_is_null</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_false_when_is_valid_is_null</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_false_when_is_valid_is_false</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_true_when_validated_and_valid</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_approved_returns_true_for_approved_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_approved_returns_false_for_non_approved_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_pending_returns_true_for_pending_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_rejected_returns_true_for_rejected_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_approve_updates_status_and_timestamps</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_approve_without_approved_by_parameter</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_reject_updates_status_and_timestamps</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_returns_false_for_invalid_article</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_requires_approval_when_approvals_enabled</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_returns_true_when_approvals_disabled</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_feed_relationship</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_article_creation_fires_new_article_fetched_event</li><li class = "covered-by-large-tests">Tests\Unit\Services\ArticleFetcherTest::test_fetch_article_data_returns_array</li><li class = "covered-by-large-tests">Tests\Unit\Services\ArticleFetcherTest::test_fetch_article_data_handles_invalid_url</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_returns_correct_structure</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_with_today_period</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_with_week_period</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_with_all_time_period</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_calculates_percentage_correctly</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_handles_zero_articles</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServiceTest::test_validate_returns_article_with_validation_status</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServiceTest::test_validate_marks_article_invalid_when_missing_data</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServiceTest::test_validate_with_supported_article_content</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServ
< tr class = "covered-by-large-tests popin d-flex" > < td data-bs-title = "82 tests cover line 54" data-bs-content = "<ul><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_false_when_validated_at_is_null</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_false_when_is_valid_is_null</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_false_when_is_valid_is_false</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_true_when_validated_and_valid</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_approved_returns_true_for_approved_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_approved_returns_false_for_non_approved_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_pending_returns_true_for_pending_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_rejected_returns_true_for_rejected_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_approve_updates_status_and_timestamps</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_approve_without_approved_by_parameter</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_reject_updates_status_and_timestamps</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_returns_false_for_invalid_article</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_requires_approval_when_approvals_enabled</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_returns_true_when_approvals_disabled</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_feed_relationship</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_article_creation_fires_new_article_fetched_event</li><li class = "covered-by-large-tests">Tests\Unit\Services\ArticleFetcherTest::test_fetch_article_data_returns_array</li><li class = "covered-by-large-tests">Tests\Unit\Services\ArticleFetcherTest::test_fetch_article_data_handles_invalid_url</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_returns_correct_structure</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_with_today_period</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_with_week_period</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_with_all_time_period</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_calculates_percentage_correctly</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_handles_zero_articles</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServiceTest::test_validate_returns_article_with_validation_status</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServiceTest::test_validate_marks_article_invalid_when_missing_data</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServiceTest::test_validate_with_supported_article_content</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServ
< tr class = "covered-by-large-tests popin d-flex" > < td data-bs-title = "82 tests cover line 55" data-bs-content = "<ul><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_false_when_validated_at_is_null</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_false_when_is_valid_is_null</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_false_when_is_valid_is_false</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_true_when_validated_and_valid</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_approved_returns_true_for_approved_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_approved_returns_false_for_non_approved_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_pending_returns_true_for_pending_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_rejected_returns_true_for_rejected_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_approve_updates_status_and_timestamps</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_approve_without_approved_by_parameter</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_reject_updates_status_and_timestamps</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_returns_false_for_invalid_article</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_requires_approval_when_approvals_enabled</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_returns_true_when_approvals_disabled</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_feed_relationship</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_article_creation_fires_new_article_fetched_event</li><li class = "covered-by-large-tests">Tests\Unit\Services\ArticleFetcherTest::test_fetch_article_data_returns_array</li><li class = "covered-by-large-tests">Tests\Unit\Services\ArticleFetcherTest::test_fetch_article_data_handles_invalid_url</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_returns_correct_structure</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_with_today_period</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_with_week_period</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_with_all_time_period</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_calculates_percentage_correctly</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_handles_zero_articles</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServiceTest::test_validate_returns_article_with_validation_status</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServiceTest::test_validate_marks_article_invalid_when_missing_data</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServiceTest::test_validate_with_supported_article_content</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServ
< tr class = "covered-by-large-tests popin d-flex" > < td data-bs-title = "82 tests cover line 56" data-bs-content = "<ul><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_false_when_validated_at_is_null</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_false_when_is_valid_is_null</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_false_when_is_valid_is_false</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_true_when_validated_and_valid</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_approved_returns_true_for_approved_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_approved_returns_false_for_non_approved_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_pending_returns_true_for_pending_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_rejected_returns_true_for_rejected_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_approve_updates_status_and_timestamps</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_approve_without_approved_by_parameter</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_reject_updates_status_and_timestamps</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_returns_false_for_invalid_article</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_requires_approval_when_approvals_enabled</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_returns_true_when_approvals_disabled</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_feed_relationship</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_article_creation_fires_new_article_fetched_event</li><li class = "covered-by-large-tests">Tests\Unit\Services\ArticleFetcherTest::test_fetch_article_data_returns_array</li><li class = "covered-by-large-tests">Tests\Unit\Services\ArticleFetcherTest::test_fetch_article_data_handles_invalid_url</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_returns_correct_structure</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_with_today_period</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_with_week_period</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_with_all_time_period</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_calculates_percentage_correctly</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_handles_zero_articles</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServiceTest::test_validate_returns_article_with_validation_status</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServiceTest::test_validate_marks_article_invalid_when_missing_data</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServiceTest::test_validate_with_supported_article_content</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServ
< tr class = "covered-by-large-tests popin d-flex" > < td data-bs-title = "82 tests cover line 57" data-bs-content = "<ul><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_false_when_validated_at_is_null</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_false_when_is_valid_is_null</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_false_when_is_valid_is_false</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_true_when_validated_and_valid</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_approved_returns_true_for_approved_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_approved_returns_false_for_non_approved_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_pending_returns_true_for_pending_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_rejected_returns_true_for_rejected_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_approve_updates_status_and_timestamps</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_approve_without_approved_by_parameter</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_reject_updates_status_and_timestamps</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_returns_false_for_invalid_article</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_requires_approval_when_approvals_enabled</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_returns_true_when_approvals_disabled</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_feed_relationship</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_article_creation_fires_new_article_fetched_event</li><li class = "covered-by-large-tests">Tests\Unit\Services\ArticleFetcherTest::test_fetch_article_data_returns_array</li><li class = "covered-by-large-tests">Tests\Unit\Services\ArticleFetcherTest::test_fetch_article_data_handles_invalid_url</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_returns_correct_structure</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_with_today_period</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_with_week_period</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_with_all_time_period</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_calculates_percentage_correctly</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_handles_zero_articles</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServiceTest::test_validate_returns_article_with_validation_status</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServiceTest::test_validate_marks_article_invalid_when_missing_data</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServiceTest::test_validate_with_supported_article_content</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServ
< tr class = "covered-by-large-tests popin d-flex" > < td data-bs-title = "82 tests cover line 58" data-bs-content = "<ul><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_false_when_validated_at_is_null</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_false_when_is_valid_is_null</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_false_when_is_valid_is_false</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_true_when_validated_and_valid</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_approved_returns_true_for_approved_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_approved_returns_false_for_non_approved_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_pending_returns_true_for_pending_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_rejected_returns_true_for_rejected_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_approve_updates_status_and_timestamps</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_approve_without_approved_by_parameter</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_reject_updates_status_and_timestamps</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_returns_false_for_invalid_article</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_requires_approval_when_approvals_enabled</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_returns_true_when_approvals_disabled</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_feed_relationship</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_article_creation_fires_new_article_fetched_event</li><li class = "covered-by-large-tests">Tests\Unit\Services\ArticleFetcherTest::test_fetch_article_data_returns_array</li><li class = "covered-by-large-tests">Tests\Unit\Services\ArticleFetcherTest::test_fetch_article_data_handles_invalid_url</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_returns_correct_structure</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_with_today_period</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_with_week_period</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_with_all_time_period</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_calculates_percentage_correctly</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_handles_zero_articles</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServiceTest::test_validate_returns_article_with_validation_status</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServiceTest::test_validate_marks_article_invalid_when_missing_data</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServiceTest::test_validate_with_supported_article_content</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServ
< tr class = "covered-by-large-tests popin d-flex" > < td data-bs-title = "82 tests cover line 59" data-bs-content = "<ul><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_false_when_validated_at_is_null</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_false_when_is_valid_is_null</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_false_when_is_valid_is_false</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_true_when_validated_and_valid</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_approved_returns_true_for_approved_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_approved_returns_false_for_non_approved_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_pending_returns_true_for_pending_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_rejected_returns_true_for_rejected_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_approve_updates_status_and_timestamps</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_approve_without_approved_by_parameter</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_reject_updates_status_and_timestamps</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_returns_false_for_invalid_article</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_requires_approval_when_approvals_enabled</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_returns_true_when_approvals_disabled</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_feed_relationship</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_article_creation_fires_new_article_fetched_event</li><li class = "covered-by-large-tests">Tests\Unit\Services\ArticleFetcherTest::test_fetch_article_data_returns_array</li><li class = "covered-by-large-tests">Tests\Unit\Services\ArticleFetcherTest::test_fetch_article_data_handles_invalid_url</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_returns_correct_structure</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_with_today_period</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_with_week_period</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_with_all_time_period</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_calculates_percentage_correctly</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_handles_zero_articles</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServiceTest::test_validate_returns_article_with_validation_status</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServiceTest::test_validate_marks_article_invalid_when_missing_data</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServiceTest::test_validate_with_supported_article_content</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServ
< tr class = "covered-by-large-tests popin d-flex" > < td data-bs-title = "82 tests cover line 60" data-bs-content = "<ul><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_false_when_validated_at_is_null</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_false_when_is_valid_is_null</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_false_when_is_valid_is_false</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_true_when_validated_and_valid</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_approved_returns_true_for_approved_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_approved_returns_false_for_non_approved_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_pending_returns_true_for_pending_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_rejected_returns_true_for_rejected_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_approve_updates_status_and_timestamps</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_approve_without_approved_by_parameter</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_reject_updates_status_and_timestamps</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_returns_false_for_invalid_article</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_requires_approval_when_approvals_enabled</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_returns_true_when_approvals_disabled</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_feed_relationship</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_article_creation_fires_new_article_fetched_event</li><li class = "covered-by-large-tests">Tests\Unit\Services\ArticleFetcherTest::test_fetch_article_data_returns_array</li><li class = "covered-by-large-tests">Tests\Unit\Services\ArticleFetcherTest::test_fetch_article_data_handles_invalid_url</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_returns_correct_structure</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_with_today_period</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_with_week_period</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_with_all_time_period</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_calculates_percentage_correctly</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_handles_zero_articles</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServiceTest::test_validate_returns_article_with_validation_status</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServiceTest::test_validate_marks_article_invalid_when_missing_data</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServiceTest::test_validate_with_supported_article_content</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServ
< tr class = "covered-by-large-tests popin d-flex" > < td data-bs-title = "82 tests cover line 61" data-bs-content = "<ul><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_false_when_validated_at_is_null</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_false_when_is_valid_is_null</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_false_when_is_valid_is_false</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_true_when_validated_and_valid</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_approved_returns_true_for_approved_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_approved_returns_false_for_non_approved_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_pending_returns_true_for_pending_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_rejected_returns_true_for_rejected_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_approve_updates_status_and_timestamps</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_approve_without_approved_by_parameter</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_reject_updates_status_and_timestamps</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_returns_false_for_invalid_article</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_requires_approval_when_approvals_enabled</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_returns_true_when_approvals_disabled</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_feed_relationship</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_article_creation_fires_new_article_fetched_event</li><li class = "covered-by-large-tests">Tests\Unit\Services\ArticleFetcherTest::test_fetch_article_data_returns_array</li><li class = "covered-by-large-tests">Tests\Unit\Services\ArticleFetcherTest::test_fetch_article_data_handles_invalid_url</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_returns_correct_structure</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_with_today_period</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_with_week_period</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_with_all_time_period</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_calculates_percentage_correctly</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_handles_zero_articles</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServiceTest::test_validate_returns_article_with_validation_status</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServiceTest::test_validate_marks_article_invalid_when_missing_data</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServiceTest::test_validate_with_supported_article_content</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServ
2025-08-03 20:59:09 +02:00
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "62" href = "#62" > 62< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > }< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "63" href = "#63" > 63< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "64" href = "#64" > 64< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > public< / span > < span class = "default" > < / span > < span class = "keyword" > function< / span > < span class = "default" > < / span > < span class = "default" > isValid< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < span class = "keyword" > :< / span > < span class = "default" > < / span > < span class = "default" > bool< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "65" href = "#65" > 65< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
2025-08-03 21:16:59 +02:00
< tr class = "covered-by-large-tests popin d-flex" > < td data-bs-title = "11 tests cover line 66" data-bs-content = "<ul><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_false_when_validated_at_is_null</li><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_false_when_is_valid_is_null</li><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_false_when_is_valid_is_false</li><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_true_when_validated_and_valid</li><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_returns_false_for_invalid_article</li><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_requires_approval_when_approvals_enabled</li><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_returns_true_when_approvals_disabled</li><li class="covered-by-large-tests">Tests\Feature\JobsAndEventsTest::test_validate_article_listener_processes_new_article</li><li class="covered-by-large-tests">Tests\Feature\JobsAndEventsTest::test_publish_approved_article_listener_queues_job</li><li class="covered-by-large-tests">Tests\Feature\ValidateArticleListenerTest::test_listener_validates_article_and_dispatches_ready_to_publish_event</li><li class="covered-by-large-tests">Tests\Feature\ValidateArticleListenerTest::test_listener_calls_validation_service</li></ul>" data-bs-placement = "top" data-bs-html = "true" class = "col-1 text-end" > < a id = "66" href = "#66" > 66< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > if< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "default" > is_null< / span > < span class = "keyword" > (< / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > validated_at< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-bs-title = "1 test covers line 67" data-bs-content = "<ul><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_false_when_validated_at_is_null</li></ul>" data-bs-placement = "top" data-bs-html = "true" class = "col-1 text-end" > < a id = "67" href = "#67" > 67< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > false< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
2025-08-03 20:59:09 +02:00
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "68" href = "#68" > 68< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > }< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "69" href = "#69" > 69< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
2025-08-03 21:16:59 +02:00
< tr class = "covered-by-large-tests popin d-flex" > < td data-bs-title = "10 tests cover line 70" data-bs-content = "<ul><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_false_when_is_valid_is_null</li><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_false_when_is_valid_is_false</li><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_true_when_validated_and_valid</li><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_returns_false_for_invalid_article</li><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_requires_approval_when_approvals_enabled</li><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_returns_true_when_approvals_disabled</li><li class="covered-by-large-tests">Tests\Feature\JobsAndEventsTest::test_validate_article_listener_processes_new_article</li><li class="covered-by-large-tests">Tests\Feature\JobsAndEventsTest::test_publish_approved_article_listener_queues_job</li><li class="covered-by-large-tests">Tests\Feature\ValidateArticleListenerTest::test_listener_validates_article_and_dispatches_ready_to_publish_event</li><li class="covered-by-large-tests">Tests\Feature\ValidateArticleListenerTest::test_listener_calls_validation_service</li></ul>" data-bs-placement = "top" data-bs-html = "true" class = "col-1 text-end" > < a id = "70" href = "#70" > 70< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > if< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "default" > is_null< / span > < span class = "keyword" > (< / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > is_valid< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-bs-title = "1 test covers line 71" data-bs-content = "<ul><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_false_when_is_valid_is_null</li></ul>" data-bs-placement = "top" data-bs-html = "true" class = "col-1 text-end" > < a id = "71" href = "#71" > 71< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > false< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
2025-08-03 20:59:09 +02:00
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "72" href = "#72" > 72< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > }< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "73" href = "#73" > 73< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
2025-08-03 21:16:59 +02:00
< tr class = "covered-by-large-tests popin d-flex" > < td data-bs-title = "9 tests cover line 74" data-bs-content = "<ul><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_false_when_is_valid_is_false</li><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_true_when_validated_and_valid</li><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_returns_false_for_invalid_article</li><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_requires_approval_when_approvals_enabled</li><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_returns_true_when_approvals_disabled</li><li class="covered-by-large-tests">Tests\Feature\JobsAndEventsTest::test_validate_article_listener_processes_new_article</li><li class="covered-by-large-tests">Tests\Feature\JobsAndEventsTest::test_publish_approved_article_listener_queues_job</li><li class="covered-by-large-tests">Tests\Feature\ValidateArticleListenerTest::test_listener_validates_article_and_dispatches_ready_to_publish_event</li><li class="covered-by-large-tests">Tests\Feature\ValidateArticleListenerTest::test_listener_calls_validation_service</li></ul>" data-bs-placement = "top" data-bs-html = "true" class = "col-1 text-end" > < a id = "74" href = "#74" > 74< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > is_valid< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
2025-08-03 20:59:09 +02:00
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "75" href = "#75" > 75< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > }< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "76" href = "#76" > 76< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "77" href = "#77" > 77< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > public< / span > < span class = "default" > < / span > < span class = "keyword" > function< / span > < span class = "default" > < / span > < span class = "default" > isApproved< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < span class = "keyword" > :< / span > < span class = "default" > < / span > < span class = "default" > bool< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "78" href = "#78" > 78< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
2025-08-03 21:16:59 +02:00
< tr class = "covered-by-large-tests popin d-flex" > < td data-bs-title = "4 tests cover line 79" data-bs-content = "<ul><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_approved_returns_true_for_approved_status</li><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_approved_returns_false_for_non_approved_status</li><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_requires_approval_when_approvals_enabled</li><li class="covered-by-large-tests">Tests\Feature\JobsAndEventsTest::test_publish_approved_article_listener_queues_job</li></ul>" data-bs-placement = "top" data-bs-html = "true" class = "col-1 text-end" > < a id = "79" href = "#79" > 79< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > approval_status< / span > < span class = "default" > < / span > < span class = "default" > ===< / span > < span class = "default" > < / span > < span class = "default" > 'approved'< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
2025-08-03 20:59:09 +02:00
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "80" href = "#80" > 80< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > }< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "81" href = "#81" > 81< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "82" href = "#82" > 82< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > public< / span > < span class = "default" > < / span > < span class = "keyword" > function< / span > < span class = "default" > < / span > < span class = "default" > isPending< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < span class = "keyword" > :< / span > < span class = "default" > < / span > < span class = "default" > bool< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "83" href = "#83" > 83< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
2025-08-03 21:16:59 +02:00
< tr class = "covered-by-large-tests popin d-flex" > < td data-bs-title = "1 test covers line 84" data-bs-content = "<ul><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_pending_returns_true_for_pending_status</li></ul>" data-bs-placement = "top" data-bs-html = "true" class = "col-1 text-end" > < a id = "84" href = "#84" > 84< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > approval_status< / span > < span class = "default" > < / span > < span class = "default" > ===< / span > < span class = "default" > < / span > < span class = "default" > 'pending'< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
2025-08-03 20:59:09 +02:00
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "85" href = "#85" > 85< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > }< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "86" href = "#86" > 86< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "87" href = "#87" > 87< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > public< / span > < span class = "default" > < / span > < span class = "keyword" > function< / span > < span class = "default" > < / span > < span class = "default" > isRejected< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < span class = "keyword" > :< / span > < span class = "default" > < / span > < span class = "default" > bool< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "88" href = "#88" > 88< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
2025-08-03 21:16:59 +02:00
< tr class = "covered-by-large-tests popin d-flex" > < td data-bs-title = "1 test covers line 89" data-bs-content = "<ul><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_rejected_returns_true_for_rejected_status</li></ul>" data-bs-placement = "top" data-bs-html = "true" class = "col-1 text-end" > < a id = "89" href = "#89" > 89< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > approval_status< / span > < span class = "default" > < / span > < span class = "default" > ===< / span > < span class = "default" > < / span > < span class = "default" > 'rejected'< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
2025-08-03 20:59:09 +02:00
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "90" href = "#90" > 90< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > }< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "91" href = "#91" > 91< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "92" href = "#92" > 92< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > public< / span > < span class = "default" > < / span > < span class = "keyword" > function< / span > < span class = "default" > < / span > < span class = "default" > approve< / span > < span class = "keyword" > (< / span > < span class = "default" > string< / span > < span class = "default" > < / span > < span class = "default" > $approvedBy< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > null< / span > < span class = "keyword" > )< / span > < span class = "keyword" > :< / span > < span class = "default" > < / span > < span class = "default" > void< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "93" href = "#93" > 93< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
2025-08-03 21:16:59 +02:00
< tr class = "covered-by-large-tests popin d-flex" > < td data-bs-title = "3 tests cover line 94" data-bs-content = "<ul><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_approve_updates_status_and_timestamps</li><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_approve_without_approved_by_parameter</li><li class="covered-by-large-tests">Tests\Feature\Http\Controllers\Api\V1\ArticlesControllerTest::test_approve_article_successfully</li></ul>" data-bs-placement = "top" data-bs-html = "true" class = "col-1 text-end" > < a id = "94" href = "#94" > 94< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > update< / span > < span class = "keyword" > (< / span > < span class = "keyword" > [< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-bs-title = "3 tests cover line 95" data-bs-content = "<ul><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_approve_updates_status_and_timestamps</li><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_approve_without_approved_by_parameter</li><li class="covered-by-large-tests">Tests\Feature\Http\Controllers\Api\V1\ArticlesControllerTest::test_approve_article_successfully</li></ul>" data-bs-placement = "top" data-bs-html = "true" class = "col-1 text-end" > < a id = "95" href = "#95" > 95< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'approval_status'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > 'approved'< / span > < span class = "keyword" > ,< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-bs-title = "3 tests cover line 96" data-bs-content = "<ul><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_approve_updates_status_and_timestamps</li><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_approve_without_approved_by_parameter</li><li class="covered-by-large-tests">Tests\Feature\Http\Controllers\Api\V1\ArticlesControllerTest::test_approve_article_successfully</li></ul>" data-bs-placement = "top" data-bs-html = "true" class = "col-1 text-end" > < a id = "96" href = "#96" > 96< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'approved_at'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > now< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ,< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-bs-title = "3 tests cover line 97" data-bs-content = "<ul><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_approve_updates_status_and_timestamps</li><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_approve_without_approved_by_parameter</li><li class="covered-by-large-tests">Tests\Feature\Http\Controllers\Api\V1\ArticlesControllerTest::test_approve_article_successfully</li></ul>" data-bs-placement = "top" data-bs-html = "true" class = "col-1 text-end" > < a id = "97" href = "#97" > 97< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'approved_by'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > $approvedBy< / span > < span class = "keyword" > ,< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-bs-title = "3 tests cover line 98" data-bs-content = "<ul><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_approve_updates_status_and_timestamps</li><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_approve_without_approved_by_parameter</li><li class="covered-by-large-tests">Tests\Feature\Http\Controllers\Api\V1\ArticlesControllerTest::test_approve_article_successfully</li></ul>" data-bs-placement = "top" data-bs-html = "true" class = "col-1 text-end" > < a id = "98" href = "#98" > 98< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > ]< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
2025-08-03 20:59:09 +02:00
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "99" href = "#99" > 99< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "100" href = "#100" > 100< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // Fire event to trigger publishing< / span > < / td > < / tr >
2025-08-03 21:16:59 +02:00
< tr class = "covered-by-large-tests popin d-flex" > < td data-bs-title = "3 tests cover line 101" data-bs-content = "<ul><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_approve_updates_status_and_timestamps</li><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_approve_without_approved_by_parameter</li><li class="covered-by-large-tests">Tests\Feature\Http\Controllers\Api\V1\ArticlesControllerTest::test_approve_article_successfully</li></ul>" data-bs-placement = "top" data-bs-html = "true" class = "col-1 text-end" > < a id = "101" href = "#101" > 101< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > event< / span > < span class = "keyword" > (< / span > < span class = "keyword" > new< / span > < span class = "default" > < / span > < span class = "default" > ArticleApproved< / span > < span class = "keyword" > (< / span > < span class = "default" > $this< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
2025-08-03 20:59:09 +02:00
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "102" href = "#102" > 102< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > }< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "103" href = "#103" > 103< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "104" href = "#104" > 104< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > public< / span > < span class = "default" > < / span > < span class = "keyword" > function< / span > < span class = "default" > < / span > < span class = "default" > reject< / span > < span class = "keyword" > (< / span > < span class = "default" > string< / span > < span class = "default" > < / span > < span class = "default" > $rejectedBy< / span > < span class = "default" > < / span > < span class = "keyword" > =< / span > < span class = "default" > < / span > < span class = "default" > null< / span > < span class = "keyword" > )< / span > < span class = "keyword" > :< / span > < span class = "default" > < / span > < span class = "default" > void< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "105" href = "#105" > 105< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
2025-08-03 21:16:59 +02:00
< tr class = "covered-by-large-tests popin d-flex" > < td data-bs-title = "2 tests cover line 106" data-bs-content = "<ul><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_reject_updates_status_and_timestamps</li><li class="covered-by-large-tests">Tests\Feature\Http\Controllers\Api\V1\ArticlesControllerTest::test_reject_article_successfully</li></ul>" data-bs-placement = "top" data-bs-html = "true" class = "col-1 text-end" > < a id = "106" href = "#106" > 106< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > update< / span > < span class = "keyword" > (< / span > < span class = "keyword" > [< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-bs-title = "2 tests cover line 107" data-bs-content = "<ul><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_reject_updates_status_and_timestamps</li><li class="covered-by-large-tests">Tests\Feature\Http\Controllers\Api\V1\ArticlesControllerTest::test_reject_article_successfully</li></ul>" data-bs-placement = "top" data-bs-html = "true" class = "col-1 text-end" > < a id = "107" href = "#107" > 107< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'approval_status'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > 'rejected'< / span > < span class = "keyword" > ,< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-bs-title = "2 tests cover line 108" data-bs-content = "<ul><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_reject_updates_status_and_timestamps</li><li class="covered-by-large-tests">Tests\Feature\Http\Controllers\Api\V1\ArticlesControllerTest::test_reject_article_successfully</li></ul>" data-bs-placement = "top" data-bs-html = "true" class = "col-1 text-end" > < a id = "108" href = "#108" > 108< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'approved_at'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > now< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ,< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-bs-title = "2 tests cover line 109" data-bs-content = "<ul><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_reject_updates_status_and_timestamps</li><li class="covered-by-large-tests">Tests\Feature\Http\Controllers\Api\V1\ArticlesControllerTest::test_reject_article_successfully</li></ul>" data-bs-placement = "top" data-bs-html = "true" class = "col-1 text-end" > < a id = "109" href = "#109" > 109< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "default" > 'approved_by'< / span > < span class = "default" > < / span > < span class = "default" > => < / span > < span class = "default" > < / span > < span class = "default" > $rejectedBy< / span > < span class = "keyword" > ,< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-bs-title = "2 tests cover line 110" data-bs-content = "<ul><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_reject_updates_status_and_timestamps</li><li class="covered-by-large-tests">Tests\Feature\Http\Controllers\Api\V1\ArticlesControllerTest::test_reject_article_successfully</li></ul>" data-bs-placement = "top" data-bs-html = "true" class = "col-1 text-end" > < a id = "110" href = "#110" > 110< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > ]< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
2025-08-03 20:59:09 +02:00
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "111" href = "#111" > 111< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > }< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "112" href = "#112" > 112< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "113" href = "#113" > 113< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > public< / span > < span class = "default" > < / span > < span class = "keyword" > function< / span > < span class = "default" > < / span > < span class = "default" > canBePublished< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < span class = "keyword" > :< / span > < span class = "default" > < / span > < span class = "default" > bool< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "114" href = "#114" > 114< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
2025-08-03 21:16:59 +02:00
< tr class = "covered-by-large-tests popin d-flex" > < td data-bs-title = "3 tests cover line 115" data-bs-content = "<ul><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_returns_false_for_invalid_article</li><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_requires_approval_when_approvals_enabled</li><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_returns_true_when_approvals_disabled</li></ul>" data-bs-placement = "top" data-bs-html = "true" class = "col-1 text-end" > < a id = "115" href = "#115" > 115< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > if< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "keyword" > !< / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > isValid< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-bs-title = "1 test covers line 116" data-bs-content = "<ul><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_returns_false_for_invalid_article</li></ul>" data-bs-placement = "top" data-bs-html = "true" class = "col-1 text-end" > < a id = "116" href = "#116" > 116< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > false< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
2025-08-03 20:59:09 +02:00
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "117" href = "#117" > 117< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > }< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "118" href = "#118" > 118< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "119" href = "#119" > 119< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // If approval system is disabled, auto-approve valid articles< / span > < / td > < / tr >
2025-08-03 21:16:59 +02:00
< tr class = "covered-by-large-tests popin d-flex" > < td data-bs-title = "2 tests cover line 120" data-bs-content = "<ul><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_requires_approval_when_approvals_enabled</li><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_returns_true_when_approvals_disabled</li></ul>" data-bs-placement = "top" data-bs-html = "true" class = "col-1 text-end" > < a id = "120" href = "#120" > 120< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > if< / span > < span class = "default" > < / span > < span class = "keyword" > (< / span > < span class = "keyword" > !< / span > < span class = "default" > \App\Models\Setting< / span > < span class = "default" > ::< / span > < span class = "default" > isPublishingApprovalsEnabled< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < span class = "keyword" > )< / span > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
< tr class = "covered-by-large-tests popin d-flex" > < td data-bs-title = "1 test covers line 121" data-bs-content = "<ul><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_returns_true_when_approvals_disabled</li></ul>" data-bs-placement = "top" data-bs-html = "true" class = "col-1 text-end" > < a id = "121" href = "#121" > 121< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > true< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
2025-08-03 20:59:09 +02:00
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "122" href = "#122" > 122< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > }< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "123" href = "#123" > 123< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "124" href = "#124" > 124< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > // If approval system is enabled, only approved articles can be published< / span > < / td > < / tr >
2025-08-03 21:16:59 +02:00
< tr class = "covered-by-large-tests popin d-flex" > < td data-bs-title = "1 test covers line 125" data-bs-content = "<ul><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_requires_approval_when_approvals_enabled</li></ul>" data-bs-placement = "top" data-bs-html = "true" class = "col-1 text-end" > < a id = "125" href = "#125" > 125< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > isApproved< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
2025-08-03 20:59:09 +02:00
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "126" href = "#126" > 126< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > }< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "127" href = "#127" > 127< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "128" href = "#128" > 128< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > /**< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "129" href = "#129" > 129< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * @return HasOne< ArticlePublication, $this> < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "130" href = "#130" > 130< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > */< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "131" href = "#131" > 131< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > public< / span > < span class = "default" > < / span > < span class = "keyword" > function< / span > < span class = "default" > < / span > < span class = "default" > articlePublication< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < span class = "keyword" > :< / span > < span class = "default" > < / span > < span class = "default" > HasOne< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "132" href = "#132" > 132< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
2025-08-03 21:16:59 +02:00
< tr class = "covered-by-large-tests popin d-flex" > < td data-bs-title = "15 tests cover line 133" data-bs-content = "<ul><li class="covered-by-large-tests">Tests\Feature\ArticlePublishingTest::test_publish_article_listener_queues_publish_job</li><li class="covered-by-large-tests">Tests\Feature\ArticlePublishingTest::test_publish_article_listener_skips_already_published_articles</li><li class="covered-by-large-tests">Tests\Feature\ArticlePublishingTest::test_publishing_prevents_duplicate_publications</li><li class="covered-by-large-tests">Tests\Feature\ArticlePublishingTest::test_multiple_articles_can_be_queued_independently</li><li class="covered-by-large-tests">Tests\Feature\Http\Controllers\Api\V1\ArticlesControllerTest::test_index_returns_articles_with_pagination</li><li class="covered-by-large-tests">Tests\Feature\Http\Controllers\Api\V1\ArticlesControllerTest::test_index_respects_per_page_limit</li><li class="covered-by-large-tests">Tests\Feature\Http\Controllers\Api\V1\ArticlesControllerTest::test_index_orders_articles_by_created_at_desc</li><li class="covered-by-large-tests">Tests\Feature\Http\Controllers\Api\V1\ArticlesControllerTest::test_approve_article_successfully</li><li class="covered-by-large-tests">Tests\Feature\Http\Controllers\Api\V1\ArticlesControllerTest::test_reject_article_successfully</li><li class="covered-by-large-tests">Tests\Feature\JobsAndEventsTest::test_validate_article_listener_processes_new_article</li><li class="covered-by-large-tests">Tests\Feature\JobsAndEventsTest::test_publish_approved_article_listener_queues_job</li><li class="covered-by-large-tests">Tests\Feature\JobsAndEventsTest::test_publish_article_listener_queues_publish_job</li><li class="covered-by-large-tests">Tests\Feature\ValidateArticleListenerTest::test_listener_validates_article_and_dispatches_ready_to_publish_event</li><li class="covered-by-large-tests">Tests\Feature\ValidateArticleListenerTest::test_listener_skips_articles_with_existing_publication</li><li class="covered-by-large-tests">Tests\Feature\ValidateArticleListenerTest::test_listener_calls_validation_service</li></ul>" data-bs-placement = "top" data-bs-html = "true" class = "col-1 text-end" > < a id = "133" href = "#133" > 133< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > hasOne< / span > < span class = "keyword" > (< / span > < span class = "default" > ArticlePublication< / span > < span class = "default" > ::< / span > < span class = "default" > class< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
2025-08-03 20:59:09 +02:00
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "134" href = "#134" > 134< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > }< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "135" href = "#135" > 135< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "136" href = "#136" > 136< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "comment" > /**< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "137" href = "#137" > 137< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > * @return BelongsTo< Feed, $this> < / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "138" href = "#138" > 138< / a > < / td > < td class = "col-11 codeLine" > < span class = "comment" > */< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "139" href = "#139" > 139< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > public< / span > < span class = "default" > < / span > < span class = "keyword" > function< / span > < span class = "default" > < / span > < span class = "default" > feed< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < span class = "keyword" > :< / span > < span class = "default" > < / span > < span class = "default" > BelongsTo< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "140" href = "#140" > 140< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
2025-08-03 21:16:59 +02:00
< tr class = "covered-by-large-tests popin d-flex" > < td data-bs-title = "7 tests cover line 141" data-bs-content = "<ul><li class="covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_feed_relationship</li><li class="covered-by-large-tests">Tests\Feature\DatabaseIntegrationTest::test_article_model_creates_successfully</li><li class="covered-by-large-tests">Tests\Feature\Http\Controllers\Api\V1\ArticlesControllerTest::test_index_returns_articles_with_pagination</li><li class="covered-by-large-tests">Tests\Feature\Http\Controllers\Api\V1\ArticlesControllerTest::test_index_respects_per_page_limit</li><li class="covered-by-large-tests">Tests\Feature\Http\Controllers\Api\V1\ArticlesControllerTest::test_index_orders_articles_by_created_at_desc</li><li class="covered-by-large-tests">Tests\Feature\Http\Controllers\Api\V1\ArticlesControllerTest::test_approve_article_successfully</li><li class="covered-by-large-tests">Tests\Feature\Http\Controllers\Api\V1\ArticlesControllerTest::test_reject_article_successfully</li></ul>" data-bs-placement = "top" data-bs-html = "true" class = "col-1 text-end" > < a id = "141" href = "#141" > 141< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > return< / span > < span class = "default" > < / span > < span class = "default" > $this< / span > < span class = "default" > -> < / span > < span class = "default" > belongsTo< / span > < span class = "keyword" > (< / span > < span class = "default" > Feed< / span > < span class = "default" > ::< / span > < span class = "default" > class< / span > < span class = "keyword" > )< / span > < span class = "keyword" > ;< / span > < / td > < / tr >
2025-08-03 20:59:09 +02:00
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "142" href = "#142" > 142< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > }< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "143" href = "#143" > 143< / a > < / td > < td class = "col-11 codeLine" > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "144" href = "#144" > 144< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > protected< / span > < span class = "default" > < / span > < span class = "keyword" > static< / span > < span class = "default" > < / span > < span class = "keyword" > function< / span > < span class = "default" > < / span > < span class = "default" > booted< / span > < span class = "keyword" > (< / span > < span class = "keyword" > )< / span > < span class = "keyword" > :< / span > < span class = "default" > < / span > < span class = "default" > void< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "145" href = "#145" > 145< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > {< / span > < / td > < / tr >
2025-08-03 21:16:59 +02:00
< tr class = "covered-by-large-tests popin d-flex" > < td data-bs-title = "82 tests cover line 146" data-bs-content = "<ul><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_false_when_validated_at_is_null</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_false_when_is_valid_is_null</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_false_when_is_valid_is_false</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_true_when_validated_and_valid</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_approved_returns_true_for_approved_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_approved_returns_false_for_non_approved_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_pending_returns_true_for_pending_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_rejected_returns_true_for_rejected_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_approve_updates_status_and_timestamps</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_approve_without_approved_by_parameter</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_reject_updates_status_and_timestamps</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_returns_false_for_invalid_article</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_requires_approval_when_approvals_enabled</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_returns_true_when_approvals_disabled</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_feed_relationship</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_article_creation_fires_new_article_fetched_event</li><li class = "covered-by-large-tests">Tests\Unit\Services\ArticleFetcherTest::test_fetch_article_data_returns_array</li><li class = "covered-by-large-tests">Tests\Unit\Services\ArticleFetcherTest::test_fetch_article_data_handles_invalid_url</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_returns_correct_structure</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_with_today_period</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_with_week_period</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_with_all_time_period</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_calculates_percentage_correctly</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_handles_zero_articles</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServiceTest::test_validate_returns_article_with_validation_status</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServiceTest::test_validate_marks_article_invalid_when_missing_data</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServiceTest::test_validate_with_supported_article_content</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationSer
< tr class = "covered-by-large-tests popin d-flex" > < td data-bs-title = "45 tests cover line 147" data-bs-content = "<ul><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_approve_updates_status_and_timestamps</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_approve_without_approved_by_parameter</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_reject_updates_status_and_timestamps</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_feed_relationship</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_article_creation_fires_new_article_fetched_event</li><li class = "covered-by-large-tests">Tests\Unit\Services\ArticleFetcherTest::test_fetch_article_data_returns_array</li><li class = "covered-by-large-tests">Tests\Unit\Services\ArticleFetcherTest::test_fetch_article_data_handles_invalid_url</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_with_today_period</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_with_all_time_period</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_calculates_percentage_correctly</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServiceTest::test_validate_returns_article_with_validation_status</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServiceTest::test_validate_marks_article_invalid_when_missing_data</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServiceTest::test_validate_with_supported_article_content</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServiceTest::test_validate_updates_article_in_database</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServiceTest::test_validate_handles_article_with_existing_validation</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServiceTest::test_validate_keyword_checking_logic</li><li class = "danger">Tests\Feature\ApiEndpointRegressionTest::test_articles_reject_endpoint_works</li><li class = "covered-by-large-tests">Tests\Feature\ArticlePublishingTest::test_publish_article_listener_queues_publish_job</li><li class = "covered-by-large-tests">Tests\Feature\ArticlePublishingTest::test_publish_article_listener_skips_already_published_articles</li><li class = "covered-by-large-tests">Tests\Feature\ArticlePublishingTest::test_publish_to_lemmy_job_calls_publishing_service</li><li class = "covered-by-large-tests">Tests\Feature\ArticlePublishingTest::test_publishing_prevents_duplicate_publications</li><li class = "covered-by-large-tests">Tests\Feature\ArticlePublishingTest::test_publish_to_lemmy_job_has_correct_queue_configuration</li><li class = "covered-by-large-tests">Tests\Feature\ArticlePublishingTest::test_multiple_articles_can_be_queued_independently</li><li class = "danger">Tests\Feature\AuthenticationAndAuthorizationTest::test_article_approval_permissions</li><li class = "danger">Tests\Feature\AuthenticationAndAuthorizationTest::test_article_rejection_permissions</li><li class = "danger">Tests\Feature\AuthenticationAndAuthorizationTest::test_csrf_protection_on_post_requests</li><li class = "covered-by-large-tests">Tests\Feature\DatabaseIntegrationTest::test_article_model_creates_successfully</li><li class = "danger">Tests\Feature\DatabaseIntegrationTest::test_article_publication_model_creat
< tr class = "covered-by-large-tests popin d-flex" > < td data-bs-title = "82 tests cover line 148" data-bs-content = "<ul><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_false_when_validated_at_is_null</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_false_when_is_valid_is_null</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_false_when_is_valid_is_false</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_valid_returns_true_when_validated_and_valid</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_approved_returns_true_for_approved_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_approved_returns_false_for_non_approved_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_pending_returns_true_for_pending_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_is_rejected_returns_true_for_rejected_status</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_approve_updates_status_and_timestamps</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_approve_without_approved_by_parameter</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_reject_updates_status_and_timestamps</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_returns_false_for_invalid_article</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_requires_approval_when_approvals_enabled</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_can_be_published_returns_true_when_approvals_disabled</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_feed_relationship</li><li class = "covered-by-large-tests">Tests\Unit\Models\ArticleTest::test_article_creation_fires_new_article_fetched_event</li><li class = "covered-by-large-tests">Tests\Unit\Services\ArticleFetcherTest::test_fetch_article_data_returns_array</li><li class = "covered-by-large-tests">Tests\Unit\Services\ArticleFetcherTest::test_fetch_article_data_handles_invalid_url</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_returns_correct_structure</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_with_today_period</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_with_week_period</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_with_all_time_period</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_calculates_percentage_correctly</li><li class = "covered-by-large-tests">Tests\Unit\Services\DashboardStatsServiceTest::test_get_stats_handles_zero_articles</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServiceTest::test_validate_returns_article_with_validation_status</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServiceTest::test_validate_marks_article_invalid_when_missing_data</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationServiceTest::test_validate_with_supported_article_content</li><li class = "covered-by-large-tests">Tests\Unit\Services\ValidationSer
2025-08-03 20:59:09 +02:00
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "149" href = "#149" > 149< / a > < / td > < td class = "col-11 codeLine" > < span class = "default" > < / span > < span class = "keyword" > }< / span > < / td > < / tr >
< tr class = " d-flex" > < td class = "col-1 text-end" > < a id = "150" href = "#150" > 150< / a > < / td > < td class = "col-11 codeLine" > < span class = "keyword" > }< / span > < / td > < / tr >
< / tbody >
< / table >
< footer >
< hr / >
< h4 > Legend< / h4 >
< p > < span class = "legend covered-by-small-tests" > Covered by small (and larger) tests< / span > < span class = "legend covered-by-medium-tests" > Covered by medium (and large) tests< / span > < span class = "legend covered-by-large-tests" > Covered by large tests (and tests of unknown size)< / span > < span class = "legend not-covered" > Not covered< / span > < span class = "legend not-coverable" > Not coverable< / span > < / p >
< p >
2025-08-03 21:16:59 +02:00
< small > Generated by < a href = "https://github.com/sebastianbergmann/php-code-coverage" target = "_top" > php-code-coverage 11.0.10< / a > using < a href = "https://www.php.net/" target = "_top" > PHP 8.4.10< / a > and < a href = "https://phpunit.de/" > PHPUnit 11.5.28< / a > at Sun Aug 3 19:15:34 UTC 2025.< / small >
2025-08-03 20:59:09 +02:00
< / p >
< a title = "Back to the top" id = "toplink" href = "#" >
< svg xmlns = "http://www.w3.org/2000/svg" width = "12" height = "16" viewBox = "0 0 12 16" > < path fill-rule = "evenodd" d = "M12 11L6 5l-6 6h12z" / > < / svg >
< / a >
< / footer >
< / div >
< script src = "../_js/jquery.min.js?v=11.0.10" type = "text/javascript" > < / script >
< script src = "../_js/bootstrap.bundle.min.js?v=11.0.10" type = "text/javascript" > < / script >
< script src = "../_js/file.js?v=11.0.10" type = "text/javascript" > < / script >
< / body >
< / html >