@@ -72,6 +72,82 @@ func TestParseGeminiAppsExportRealOuterCellHeaderShape(t *testing.T) {
7272 assert .Equal (t , firstID , repeated [0 ].Session .ID )
7373}
7474
75+ func TestParseGeminiAppsRejectsNotPromptedActivityLabel (t * testing.T ) {
76+ fixture := strings .ReplaceAll (
77+ sanitizedGeminiAppsHTML ,
78+ "<p>Prompted<br></p>" ,
79+ "<p>Not Prompted</p>" ,
80+ )
81+ path := filepath .Join (t .TempDir (), "not-prompted.html" )
82+ require .NoError (t , os .WriteFile (path , []byte (fixture ), 0o644 ))
83+
84+ provider , ok := NewProvider (AgentGeminiApps , ProviderConfig {})
85+ require .True (t , ok )
86+ exporter := provider .(GeminiAppsExportParser )
87+ var results []ParseResult
88+ summary , err := exporter .ParseGeminiAppsExport (path , func (result ParseResult ) error {
89+ results = append (results , result )
90+ return nil
91+ })
92+ assert .Empty (t , results )
93+ assert .Equal (t , 5 , summary .Skipped )
94+ assert .ErrorContains (t , err , "no admissible Prompted records" )
95+ }
96+
97+ func TestParseGeminiAppsPreservesOrdinaryResponseAndAnswerText (t * testing.T ) {
98+ fixture := strings .Replace (
99+ sanitizedGeminiAppsHTML ,
100+ `<div class="content-cell mdl-cell"><p>first prompt<br></p><p><strong>first</strong> answer & detail</p><script>secret script</script><style>secret style</style><template>secret template</template><noscript>secret noscript</noscript></div>` ,
101+ `<div class="content-cell mdl-cell"><p>ordinary Response: and Answer: text</p></div>` ,
102+ 1 ,
103+ )
104+ path := filepath .Join (t .TempDir (), "ordinary-markers.html" )
105+ require .NoError (t , os .WriteFile (path , []byte (fixture ), 0o644 ))
106+
107+ provider , ok := NewProvider (AgentGeminiApps , ProviderConfig {})
108+ require .True (t , ok )
109+ exporter := provider .(GeminiAppsExportParser )
110+ var results []ParseResult
111+ _ , err := exporter .ParseGeminiAppsExport (path , func (result ParseResult ) error {
112+ results = append (results , result )
113+ return nil
114+ })
115+ require .NoError (t , err )
116+ require .Len (t , results , 2 )
117+ require .Len (t , results [0 ].Messages , 1 )
118+ assert .Equal (t , "ordinary Response: and Answer: text" , results [0 ].Messages [0 ].Content )
119+ }
120+
121+ func TestParseGeminiAppsTimestampMustBeInHeader (t * testing.T ) {
122+ fixture := strings .Replace (
123+ sanitizedGeminiAppsHTML ,
124+ "<p>Jan 2, 2025, 3:04:05 PM EDT</p>" ,
125+ "<p>header timestamp missing</p>" ,
126+ 1 ,
127+ )
128+ fixture = strings .Replace (
129+ fixture ,
130+ "<p>first prompt<br></p>" ,
131+ "<p>Jan 2, 2025, 3:04:05 PM EDT</p><p>first prompt</p>" ,
132+ 1 ,
133+ )
134+ path := filepath .Join (t .TempDir (), "content-date.html" )
135+ require .NoError (t , os .WriteFile (path , []byte (fixture ), 0o644 ))
136+
137+ provider , ok := NewProvider (AgentGeminiApps , ProviderConfig {})
138+ require .True (t , ok )
139+ exporter := provider .(GeminiAppsExportParser )
140+ var results []ParseResult
141+ summary , err := exporter .ParseGeminiAppsExport (path , func (result ParseResult ) error {
142+ results = append (results , result )
143+ return nil
144+ })
145+ require .NoError (t , err )
146+ assert .Len (t , results , 1 )
147+ assert .Equal (t , 1 , summary .Errors )
148+ assert .Equal (t , "second prompt" , results [0 ].Messages [0 ].Content )
149+ }
150+
75151func TestParseGeminiAppsExportAdmitsDirectoryAndRejectsOtherHTML (t * testing.T ) {
76152 root := t .TempDir ()
77153 require .NoError (t , os .WriteFile (
0 commit comments