@@ -40,16 +40,18 @@ func (s *CCStatuslineTestSuite) TearDownTest() {
4040 os .Remove (s .socketPath )
4141}
4242
43- // getDailyCostWithDaemonFallback Tests
43+ // getDaemonInfoWithFallback Tests
4444
45- func (s * CCStatuslineTestSuite ) TestGetDailyStats_UsesDaemonWhenAvailable () {
45+ func (s * CCStatuslineTestSuite ) TestGetDaemonInfo_UsesDaemonWhenAvailable () {
4646 // Start mock daemon socket
4747 listener , err := net .Listen ("unix" , s .socketPath )
4848 assert .NoError (s .T (), err )
4949 s .listener = listener
5050
5151 expectedCost := 15.67
5252 expectedSessionSeconds := 3600
53+ expectedBranch := "main"
54+ expectedDirty := true
5355 go func () {
5456 conn , _ := listener .Accept ()
5557 defer conn .Close ()
@@ -62,6 +64,8 @@ func (s *CCStatuslineTestSuite) TestGetDailyStats_UsesDaemonWhenAvailable() {
6264 TotalSessionSeconds : expectedSessionSeconds ,
6365 TimeRange : "today" ,
6466 CachedAt : time .Now (),
67+ GitBranch : expectedBranch ,
68+ GitDirty : expectedDirty ,
6569 }
6670 json .NewEncoder (conn ).Encode (response )
6771 }()
@@ -72,27 +76,31 @@ func (s *CCStatuslineTestSuite) TestGetDailyStats_UsesDaemonWhenAvailable() {
7276 SocketPath : s .socketPath ,
7377 }
7478
75- stats := getDailyStatsWithDaemonFallback (context .Background (), config )
79+ result := getDaemonInfoWithFallback (context .Background (), config , "/some/path" )
7680
77- assert .Equal (s .T (), expectedCost , stats .Cost )
78- assert .Equal (s .T (), expectedSessionSeconds , stats .SessionSeconds )
81+ assert .Equal (s .T (), expectedCost , result .Cost )
82+ assert .Equal (s .T (), expectedSessionSeconds , result .SessionSeconds )
83+ assert .Equal (s .T (), expectedBranch , result .GitBranch )
84+ assert .Equal (s .T (), expectedDirty , result .GitDirty )
7985}
8086
81- func (s * CCStatuslineTestSuite ) TestGetDailyStats_FallbackWhenDaemonUnavailable () {
87+ func (s * CCStatuslineTestSuite ) TestGetDaemonInfo_FallbackWhenDaemonUnavailable () {
8288 // No socket exists, should fall back to cached API
8389 config := model.ShellTimeConfig {
8490 SocketPath : "/nonexistent/socket.sock" ,
8591 Token : "" , // No token means FetchDailyStatsCached returns zero values
8692 }
8793
88- stats := getDailyStatsWithDaemonFallback (context .Background (), config )
94+ result := getDaemonInfoWithFallback (context .Background (), config , "" )
8995
9096 // Should return zero values (from cache fallback with no token)
91- assert .Equal (s .T (), float64 (0 ), stats .Cost )
92- assert .Equal (s .T (), 0 , stats .SessionSeconds )
97+ assert .Equal (s .T (), float64 (0 ), result .Cost )
98+ assert .Equal (s .T (), 0 , result .SessionSeconds )
99+ assert .Empty (s .T (), result .GitBranch )
100+ assert .False (s .T (), result .GitDirty )
93101}
94102
95- func (s * CCStatuslineTestSuite ) TestGetDailyStats_FallbackOnDaemonError () {
103+ func (s * CCStatuslineTestSuite ) TestGetDaemonInfo_FallbackOnDaemonError () {
96104 // Start mock daemon that returns error
97105 listener , err := net .Listen ("unix" , s .socketPath )
98106 assert .NoError (s .T (), err )
@@ -111,14 +119,16 @@ func (s *CCStatuslineTestSuite) TestGetDailyStats_FallbackOnDaemonError() {
111119 Token : "" , // No token
112120 }
113121
114- stats := getDailyStatsWithDaemonFallback (context .Background (), config )
122+ result := getDaemonInfoWithFallback (context .Background (), config , "" )
115123
116124 // Should fall back and return zero values
117- assert .Equal (s .T (), float64 (0 ), stats .Cost )
118- assert .Equal (s .T (), 0 , stats .SessionSeconds )
125+ assert .Equal (s .T (), float64 (0 ), result .Cost )
126+ assert .Equal (s .T (), 0 , result .SessionSeconds )
127+ assert .Empty (s .T (), result .GitBranch )
128+ assert .False (s .T (), result .GitDirty )
119129}
120130
121- func (s * CCStatuslineTestSuite ) TestGetDailyStats_UsesDefaultSocketPath () {
131+ func (s * CCStatuslineTestSuite ) TestGetDaemonInfo_UsesDefaultSocketPath () {
122132 // Test that default socket path is used when config is empty
123133 config := model.ShellTimeConfig {
124134 SocketPath : "" , // Empty path - should use model.DefaultSocketPath
@@ -127,54 +137,71 @@ func (s *CCStatuslineTestSuite) TestGetDailyStats_UsesDefaultSocketPath() {
127137
128138 // This should use model.DefaultSocketPath internally
129139 // Since no daemon is running at the default path, it will fall back to cached API
130- // The function should not panic and should return a valid stats struct
131- stats := getDailyStatsWithDaemonFallback (context .Background (), config )
140+ // The function should not panic and should return a valid result struct
141+ result := getDaemonInfoWithFallback (context .Background (), config , "" )
132142
133143 // We can't assert on exact values since the global cache might have data
134144 // from previous tests. Just verify the function returns without error
135145 // and returns non-negative values
136- assert .GreaterOrEqual (s .T (), stats .Cost , float64 (0 ))
137- assert .GreaterOrEqual (s .T (), stats .SessionSeconds , 0 )
146+ assert .GreaterOrEqual (s .T (), result .Cost , float64 (0 ))
147+ assert .GreaterOrEqual (s .T (), result .SessionSeconds , 0 )
138148}
139149
140150// formatStatuslineOutput Tests
141151
142152func (s * CCStatuslineTestSuite ) TestFormatStatuslineOutput_AllValues () {
143- output := formatStatuslineOutput ("claude-opus-4" , 1.23 , 4.56 , 3661 , 75.0 )
153+ output := formatStatuslineOutput ("claude-opus-4" , 1.23 , 4.56 , 3661 , 75.0 , "main" , false )
144154
145155 // Should contain all components
156+ assert .Contains (s .T (), output , "🌿 main" )
146157 assert .Contains (s .T (), output , "🤖 claude-opus-4" )
147158 assert .Contains (s .T (), output , "$1.23" )
148159 assert .Contains (s .T (), output , "$4.56" )
149160 assert .Contains (s .T (), output , "1h1m" ) // Session time (3661 seconds = 1h 1m 1s)
150161 assert .Contains (s .T (), output , "75%" ) // Context percentage
151162}
152163
164+ func (s * CCStatuslineTestSuite ) TestFormatStatuslineOutput_WithDirtyBranch () {
165+ output := formatStatuslineOutput ("claude-opus-4" , 1.23 , 4.56 , 3661 , 75.0 , "feature/test" , true )
166+
167+ // Should contain branch with asterisk for dirty
168+ assert .Contains (s .T (), output , "🌿 feature/test*" )
169+ assert .Contains (s .T (), output , "🤖 claude-opus-4" )
170+ }
171+
172+ func (s * CCStatuslineTestSuite ) TestFormatStatuslineOutput_NoBranch () {
173+ output := formatStatuslineOutput ("claude-opus-4" , 1.23 , 4.56 , 3661 , 75.0 , "" , false )
174+
175+ // Should show "-" for no branch
176+ assert .Contains (s .T (), output , "🌿 -" )
177+ assert .Contains (s .T (), output , "🤖 claude-opus-4" )
178+ }
179+
153180func (s * CCStatuslineTestSuite ) TestFormatStatuslineOutput_ZeroDailyCost () {
154- output := formatStatuslineOutput ("claude-sonnet" , 0.50 , 0 , 300 , 50.0 )
181+ output := formatStatuslineOutput ("claude-sonnet" , 0.50 , 0 , 300 , 50.0 , "main" , false )
155182
156183 // Should show "-" for zero daily cost
157184 assert .Contains (s .T (), output , "📊 -" )
158185 assert .Contains (s .T (), output , "5m0s" ) // Session time (300 seconds = 5m)
159186}
160187
161188func (s * CCStatuslineTestSuite ) TestFormatStatuslineOutput_ZeroSessionSeconds () {
162- output := formatStatuslineOutput ("claude-sonnet" , 0.50 , 1.0 , 0 , 50.0 )
189+ output := formatStatuslineOutput ("claude-sonnet" , 0.50 , 1.0 , 0 , 50.0 , "main" , false )
163190
164191 // Should show "-" for zero session seconds
165192 assert .Contains (s .T (), output , "⏱️ -" )
166193}
167194
168195func (s * CCStatuslineTestSuite ) TestFormatStatuslineOutput_HighContextPercentage () {
169- output := formatStatuslineOutput ("test-model" , 1.0 , 1.0 , 60 , 85.0 )
196+ output := formatStatuslineOutput ("test-model" , 1.0 , 1.0 , 60 , 85.0 , "main" , false )
170197
171198 // Should contain the percentage (color codes may vary)
172199 assert .Contains (s .T (), output , "85%" )
173200 assert .Contains (s .T (), output , "1m0s" )
174201}
175202
176203func (s * CCStatuslineTestSuite ) TestFormatStatuslineOutput_LowContextPercentage () {
177- output := formatStatuslineOutput ("test-model" , 1.0 , 1.0 , 45 , 25.0 )
204+ output := formatStatuslineOutput ("test-model" , 1.0 , 1.0 , 45 , 25.0 , "main" , false )
178205
179206 // Should contain the percentage
180207 assert .Contains (s .T (), output , "25%" )
0 commit comments