mirror of
https://github.com/affaan-m/ECC.git
synced 2026-09-30 21:45:13 +02:00
Adds a curated, Pi-native, skills+prompts-only profile at pi/core/ for downstream packagers that mirror GitHub Releases. - manifests/pi-core.json: explicit include lists, per-item exclusion reasons, curation rules, safety allowlists; every root skill and command must be classified. - scripts/build-pi-core.js regenerates pi/core deterministically (package.json from VERSION, LICENSE, README.md, CURATION.md, skills/, commands/); --check fails CI on drift. council is renamed ecc-council inside pi/core only. - Safety checks: no callable endpoints outside the allowlist, no npx/curl|sh/pip install, no secrets, no absolute home paths, no symlinks, valid frontmatter, no duplicate names. - CI: build + drift check and an offline Pi CLI load test of pi/core. - Release: VERSION, package.json and pi/core/package.json at 2.2.2, CHANGELOG, tag-triggered release verification, and a two-week cadence in CONTRIBUTING.md. pi/core: 123 of 293 skills and 24 of 94 commands; 35,006 characters of skill description text.
2.6 KiB
2.6 KiB
Testing Fundamentals
This guide covers the fundamental principles and practices for writing Angular unit and component tests. Use the runner already configured in the project.
Core Philosophy: Async-First
Modern Angular applications often schedule state changes asynchronously, especially when using signals or zoneless change detection. Tests should account for this.
Prefer the "Act, Wait, Assert" pattern:
- Act: Update state or perform an action (e.g., set a component input, click a button).
- Wait: Use
await fixture.whenStable()to allow the framework to process the scheduled update and render the changes. - Assert: Verify the outcome.
Basic Test Structure Example
import {ComponentFixture, TestBed} from '@angular/core/testing';
import {MyComponent} from './my.component';
describe('MyComponent', () => {
let component: MyComponent;
let fixture: ComponentFixture<MyComponent>;
let h1: HTMLElement;
beforeEach(async () => {
// 1. Configure the test module
await TestBed.configureTestingModule({
imports: [MyComponent],
}).compileComponents();
// 2. Create the component fixture
fixture = TestBed.createComponent(MyComponent);
component = fixture.componentInstance;
h1 = fixture.nativeElement.querySelector('h1');
});
it('should display the default title', async () => {
// ACT: (Implicit) Component is created with default state.
// WAIT for initial data binding.
await fixture.whenStable();
// ASSERT the initial state.
expect(h1.textContent).toContain('Default Title');
});
it('should display a different title after a change', async () => {
// ACT: Change the component's title property.
component.title.set('New Test Title');
// WAIT for the asynchronous update to complete.
await fixture.whenStable();
// ASSERT the DOM has been updated.
expect(h1.textContent).toContain('New Test Title');
});
});
TestBed and ComponentFixture
TestBed: The primary utility for creating a test-specific Angular module. UseTestBed.configureTestingModule({...})in yourbeforeEachto declare components, provide services, and set up imports needed for your test.ComponentFixture: A handle on the created component instance and its environment.fixture.componentInstance: Access the component's class instance.fixture.nativeElement: Access the component's root DOM element.fixture.debugElement: An Angular-specific wrapper around thenativeElementthat provides safer, platform-agnostic ways to query the DOM (e.g.,debugElement.query(By.css('p'))).