Release Please / Release Please (push) Skipped
Release / GoReleaser (push) Skipped
Tests / Secret scan (gitleaks) (push) Skipped
Tests / Test (Go 1.25) (push) Skipped
Tests / Test (Go stable) (push) Skipped
Tests / Secret scan (gitleaks) (pull_request) Successful in 5s
Tests / Test (Go 1.25) (pull_request) Successful in 1m16s
Tests / Test (Go stable) (pull_request) Successful in 1m36s
Promote the generic, reusable parts of the private oo-workspace into the public library/CLI, so oo-workspace can shrink to business glue. - board.go: Board types + (c *Client) SyncBoard — upsert project milestones/tasks by exact title from a YAML board (dry-run when apply=false). CLI: oo projects board-sync. - crm_audit.go: OpportunityAudit + (c *Client) AuditOpportunities — file/task/member counts with a generic class (ok|dup|empty|junk-title). CLI: oo crm audit [--out]. - catalog/names.go: CleanPersonNames / GuessNameFromEmail / FormatProjectTitle (ported from oo-workspace). - catalog: adopt the newer apply/match logic — name repair (never encode company in lastName), company grouping key, contact-info type normalization, preserve an already-applied oo_id. Keeps the local Address/OOProjects fields and the config-driven classifier. Business-only oo-workspace commands (crm clean/migrate, folders, search) deliberately stay private.
42 lines
1.1 KiB
Go
42 lines
1.1 KiB
Go
package catalog
|
|
|
|
import "testing"
|
|
|
|
func TestCleanPersonNamesStripsCompanyParen(t *testing.T) {
|
|
f, l := CleanPersonNames("John", "Smith (Acme)", "John Smith (Acme)", "Acme", nil)
|
|
if f != "John" || l != "Smith" {
|
|
t.Fatalf("got %q %q", f, l)
|
|
}
|
|
}
|
|
|
|
func TestCleanPersonNamesStripsDashCompany(t *testing.T) {
|
|
f, l := CleanPersonNames("Jens", "Meyer - Acme", "", "Acme", nil)
|
|
if f != "Jens" || l != "Meyer" {
|
|
t.Fatalf("got %q %q", f, l)
|
|
}
|
|
}
|
|
|
|
func TestCleanPersonNamesFromEmail(t *testing.T) {
|
|
f, l := CleanPersonNames("david.patzke@acme.example", "-", "", "Acme",
|
|
[]string{"david.patzke@acme.example"})
|
|
if f != "David" || l != "Patzke" {
|
|
t.Fatalf("got %q %q", f, l)
|
|
}
|
|
}
|
|
|
|
func TestCleanPersonNamesLastIsCompany(t *testing.T) {
|
|
f, l := CleanPersonNames("Thorsten", "Acme", "", "Acme GmbH & Co. KG", nil)
|
|
if f != "Thorsten" || l != "-" {
|
|
t.Fatalf("got %q %q", f, l)
|
|
}
|
|
}
|
|
|
|
func TestFormatProjectTitle(t *testing.T) {
|
|
if got := FormatProjectTitle("DE", "Acme", "Golang"); got != "DE | Acme | Golang" {
|
|
t.Fatalf("got %q", got)
|
|
}
|
|
if got := FormatProjectTitle("", "Acme", ""); got != "Acme" {
|
|
t.Fatalf("got %q", got)
|
|
}
|
|
}
|