package classes import ( "testing" "git.golem15.com/golem15/sm-seo-plugin/models" ) // layer is one layer of a value chain: its source and the value it holds // when present. type layer struct{ source, value string } // TestResolverPrecedence: every value chain of the resolver (P-14) with // each layer present and absent picks the first present layer and reports // its source; robots merge per directive; outside production the lock // wins; a draft is not found. The Postgres-backed answer with stored rules // and entries is TestResolverPrecedence in the plugin package. func TestResolverPrecedence(t *testing.T) { chains := map[string][]layer{ // rule > record > type or general template > content > site name "title": {{SourceRule, "Rule title"}, {SourceRecord, "Record title"}, {SourceTemplate, "Post | Site"}, {SourceContent, "Post"}, {SourceGlobal, "Site"}}, // rule > record > type template > content > default description "description": {{SourceRule, "Rule desc"}, {SourceRecord, "Record desc"}, {SourceTemplate, "Template desc"}, {SourceContent, "Excerpt"}, {SourceGlobal, "Default desc"}}, // rule > record (else the address itself) "canonical": {{SourceRule, "/rule"}, {SourceRecord, "/record"}}, // override rule > record > the effective title "og_title": {{SourceRule, "OG rule"}, {SourceRecord, "OG record"}, {SourceTemplate, "Effective title"}}, // override rule > record > the effective description "og_description": {{SourceRule, "OG rule"}, {SourceRecord, "OG record"}, {SourceContent, "Effective description"}}, // rule > record > content image > default social image "og_image": {{SourceRule, "/r.png"}, {SourceRecord, "/e.png"}, {SourceContent, "/c.png"}, {SourceGlobal, "/d.png"}}, } for name, chain := range chains { t.Run(name, func(t *testing.T) { for mask := 0; mask < 1<