···255255256256 return nil
257257}
258258+259259+func TestHeartbeat(c *cobra.Command, args []string) error {
260260+ // Initialize a new context with task state
261261+ c.SetContext(context.WithValue(context.Background(), "taskState", &taskState{}))
262262+263263+ printTask(c, "Validating arguments")
264264+265265+ configApiKey, _ := c.Flags().GetString("key")
266266+ configApiURL, _ := c.Flags().GetString("url")
267267+268268+ // If either value is missing, try to load from config file
269269+ if configApiKey == "" || configApiURL == "" {
270270+ userDir, err := os.UserHomeDir()
271271+ if err != nil {
272272+ errorTask(c, "Validating arguments")
273273+ return err
274274+ }
275275+ wakatimePath := filepath.Join(userDir, ".wakatime.cfg")
276276+277277+ cfg, err := ini.Load(wakatimePath)
278278+ if err != nil {
279279+ errorTask(c, "Validating arguments")
280280+ return errors.New("config file not found and you haven't passed all arguments")
281281+ }
282282+283283+ settings, err := cfg.GetSection("settings")
284284+ if err != nil {
285285+ errorTask(c, "Validating arguments")
286286+ return errors.New("no settings section in your config")
287287+ }
288288+289289+ // Only load from config if not provided as parameter
290290+ if configApiKey == "" {
291291+ configApiKey = settings.Key("api_key").String()
292292+ if configApiKey == "" {
293293+ errorTask(c, "Validating arguments")
294294+ return errors.New("couldn't find an api_key in your config")
295295+ }
296296+ }
297297+298298+ if configApiURL == "" {
299299+ configApiURL = settings.Key("api_url").String()
300300+ if configApiURL == "" {
301301+ errorTask(c, "Validating arguments")
302302+ return errors.New("couldn't find an api_url in your config")
303303+ }
304304+ }
305305+ }
306306+307307+ completeTask(c, "Arguments look fine!")
308308+309309+ printTask(c, "Loading api client")
310310+311311+ client := wakatime.NewClientWithOptions(configApiKey, configApiURL)
312312+ _, err := client.GetStatusBar()
313313+ if err != nil {
314314+ errorTask(c, "Loading api client")
315315+ return err
316316+ }
317317+318318+ completeTask(c, "Loading api client")
319319+320320+ c.Println("Sending a test heartbeat to", styles.Muted.Render(configApiURL))
321321+322322+ printTask(c, "Sending test heartbeat")
323323+324324+ err = client.SendHeartbeat(testHeartbeat)
325325+326326+ if err != nil {
327327+ errorTask(c, "Sending test heartbeat")
328328+ return err
329329+ }
330330+331331+ completeTask(c, "Sending test heartbeat")
332332+333333+ c.Println("❇️ test heartbeat sent!")
334334+335335+ return nil
336336+}
+10
main.go
···3232 RunE: handler.Doctor,
3333 })
34343535+ cmdTest := &cobra.Command{
3636+ Use: "test",
3737+ Short: "send a test heartbeat to hackatime or whatever api url you provide",
3838+ RunE: handler.TestHeartbeat,
3939+ Args: cobra.NoArgs,
4040+ }
4141+ cmdTest.Flags().StringP("url", "u", "", "The base url for the hackatime client")
4242+ cmdTest.Flags().StringP("key", "k", "", "API key to use for authentication")
4343+ cmd.AddCommand(cmdTest)
4444+3545 // this is where we get the fancy fang magic ✨
3646 if err := fang.Execute(
3747 context.Background(),