@@ -231,15 +231,92 @@ func TestGetPatentInfoParsed(t *testing.T) {
231231 }
232232}
233233
234- func TestGetPatentInfoParsed_NotFound (t * testing.T ) {
234+ func TestIsRegisteredNumber (t * testing.T ) {
235+ tests := []struct {
236+ input string
237+ want bool
238+ }{
239+ {"100273629" , true },
240+ {"123" , true },
241+ {"" , false },
242+ {"DE123C" , false },
243+ {"DE10027362" , false },
244+ {"de123c" , false },
245+ {"10027362B4" , false },
246+ }
247+ for _ , tt := range tests {
248+ t .Run (tt .input , func (t * testing.T ) {
249+ got := isRegisteredNumber (tt .input )
250+ if got != tt .want {
251+ t .Errorf ("isRegisteredNumber(%q) = %v, want %v" , tt .input , got , tt .want )
252+ }
253+ })
254+ }
255+ }
256+
257+ func TestGetPatentInfoParsed_RegisteredNumber (t * testing.T ) {
258+ // Bare registered number should call getRegisterInfo directly
259+ handler := func (w http.ResponseWriter , r * http.Request ) {
260+ requireAuth (t , r )
261+ requirePath (t , r , "/DPMAregisterPatService/getRegisterInfo/100273629" )
262+ w .WriteHeader (http .StatusOK )
263+ w .Write (patentInfoXML )
264+ }
265+
266+ server , client := setupMockServer (t , handler )
267+ defer server .Close ()
268+
269+ result , err := client .GetPatentInfoParsed (context .Background (), "100273629" )
270+ if err != nil {
271+ t .Fatalf ("GetPatentInfoParsed error = %v" , err )
272+ }
273+ if result .Title == "" {
274+ t .Error ("Title is empty" )
275+ }
276+ }
277+
278+ func TestGetPatentInfoParsed_PublicationNumber (t * testing.T ) {
279+ // DE patent number with prefix should resolve via search
280+ reqCount := 0
281+ handler := func (w http.ResponseWriter , r * http.Request ) {
282+ requireAuth (t , r )
283+ reqCount ++
284+ w .WriteHeader (http .StatusOK )
285+ if reqCount == 1 {
286+ // First request: search by PN=DE10027362C2
287+ requirePath (t , r , "/DPMAregisterPatService/search/" )
288+ w .Write (patentSearchXML )
289+ } else {
290+ // Second request: get info by registered number from search result
291+ requirePath (t , r , "/DPMAregisterPatService/getRegisterInfo/" )
292+ w .Write (patentInfoXML )
293+ }
294+ }
295+
296+ server , client := setupMockServer (t , handler )
297+ defer server .Close ()
298+
299+ result , err := client .GetPatentInfoParsed (context .Background (), "DE10027362C2" )
300+ if err != nil {
301+ t .Fatalf ("GetPatentInfoParsed error = %v" , err )
302+ }
303+ if result .Title == "" {
304+ t .Error ("Title is empty" )
305+ }
306+ if reqCount != 2 {
307+ t .Errorf ("expected 2 requests (search + info), got %d" , reqCount )
308+ }
309+ }
310+
311+ func TestGetPatentInfoParsed_NotFound_RegisteredNumber (t * testing.T ) {
235312 handler := func (w http.ResponseWriter , r * http.Request ) {
236313 w .WriteHeader (http .StatusNotFound )
237314 }
238315
239316 server , client := setupMockServer (t , handler )
240317 defer server .Close ()
241318
242- _ , err := client .GetPatentInfoParsed (context .Background (), "INVALID " )
319+ _ , err := client .GetPatentInfoParsed (context .Background (), "999999999 " )
243320 if err == nil {
244321 t .Fatal ("expected error for 404" )
245322 }
@@ -248,6 +325,25 @@ func TestGetPatentInfoParsed_NotFound(t *testing.T) {
248325 }
249326}
250327
328+ func TestGetPatentInfoParsed_NotFound_PublicationNumber (t * testing.T ) {
329+ handler := func (w http.ResponseWriter , r * http.Request ) {
330+ w .WriteHeader (http .StatusOK )
331+ w .Write ([]byte (`<?xml version="1.0" encoding="UTF-8"?><PatentHitList HitCount="0"/>` ))
332+ }
333+
334+ server , client := setupMockServer (t , handler )
335+ defer server .Close ()
336+
337+ _ , err := client .GetPatentInfoParsed (context .Background (), "DE999999999X1" )
338+ if err == nil {
339+ t .Fatal ("expected error for no results" )
340+ }
341+ var notFound * NotFoundError
342+ if ! errors .As (err , & notFound ) {
343+ t .Errorf ("expected *NotFoundError, got %T: %v" , err , err )
344+ }
345+ }
346+
251347func TestGetPatentInfoByPublicationNumber (t * testing.T ) {
252348 // Mock server returns search results for the first request,
253349 // then patent info for the second.
0 commit comments