assertListIndexCoverage('core'); } /** * 도출 규칙 자체가 맞는지 검사합니다. * * 커버리지 검사가 초록이어도 도출이 틀렸으면 엉뚱한 색인을 요구하거나 요구하지 않는다. * 판정기를 판정한다. */ public function test_required_columns_are_derived_from_declaration(): void { $advisor = new ListIndexAdvisor; $this->assertSame( ['board_id', 'is_notice', 'deleted_at', 'created_at', 'id'], $advisor->requiredColumns([ 'filters' => ['board_id' => 1, 'is_notice' => 0], 'soft_delete' => true, 'order' => [['created_at', 'desc'], ['id', 'desc']], ]), '등치 필터 → deleted_at → 정렬 → 기본키 순서로 도출되어야 한다' ); $this->assertSame( ['deleted_at', 'ordered_at', 'id'], $advisor->requiredColumns([ // in / not in 은 선행 컬럼이 등치로 고정되지 않아 뒤의 정렬을 인덱스로 쓸 수 없다 'filters' => ['order_status' => ['not in', ['draft', 'hidden']]], 'soft_delete' => true, 'order' => [['ordered_at', 'desc'], ['id', 'desc']], ]), '비-등치 필터는 선행 컬럼에서 제외되어야 한다' ); $this->assertSame( ['created_at', 'id'], $advisor->requiredColumns([ 'order' => [['created_at', 'desc']], ]), '정렬 끝에 기본키가 없으면 자동으로 덧붙여야 한다' ); } /** * 면제는 사유가 있을 때만 인정되는지 검사합니다. */ public function test_exemption_requires_a_reason(): void { $advisor = new ListIndexAdvisor; $this->assertNull($advisor->exemptionReason([])); $this->assertNull($advisor->exemptionReason(['index_exempt' => ' '])); $this->assertNull($advisor->exemptionReason(['index_exempt' => true])); $this->assertSame('행 수 고정', $advisor->exemptionReason(['index_exempt' => '행 수 고정'])); } }