package main

import (
	"errors"
	"sync"
	"testing"
)

func TestConcurrentRetry(t *testing.T) {
	s := NewStore()
	var wg sync.WaitGroup
	for range 100 {
		wg.Go(func() {
			task, _, err := s.Create("a", "k", "title")
			if err != nil || task.ID != 1 {
				t.Errorf("task=%+v err=%v", task, err)
			}
		})
	}
	wg.Wait()
	if len(s.tasks) != 1 || len(s.outbox) != 1 {
		t.Fatal("duplicate effects")
	}
	if _, _, err := s.Create("a", "k", "other"); !errors.Is(err, ErrConflict) {
		t.Fatal(err)
	}
	if task, _, err := s.Create("b", "k", "title"); err != nil || task.ID != 2 {
		t.Fatal(task, err)
	}
}
func TestLostResponseModel(t *testing.T) {
	s := NewStore()
	// The first response is discarded after the write committed.
	_, _, _ = s.Create("a", "k", "title")
	got, replay, err := s.Create("a", "k", "title")
	if err != nil || !replay || got.ID != 1 {
		t.Fatal(got, replay, err)
	}
}
