| 1 | using System.Net.Http.Headers; |
| 2 | using System.Net.Http.Json; |
| 3 | using System.Text.Json; |
| 4 | using IntercomService.Contracts; |
| 5 | |
| 6 | namespace IntercomService.Tests; |
| 7 | |
| 8 | [Collection("IntercomApi")] |
| 9 | public sealed class TransportApiTests |
| 10 | { |
| 11 | private readonly HttpClient _client; |
| 12 | |
| 13 | public TransportApiTests(IntercomWebApplicationFactory factory) => |
| 14 | _client = factory.CreateClient(); |
| 15 | |
| 16 | [Fact] |
| 17 | public async Task Health_returns_ok() |
| 18 | { |
| 19 | var response = await _client.GetAsync("/health"); |
| 20 | response.EnsureSuccessStatusCode(); |
| 21 | } |
| 22 | |
| 23 | [Fact] |
| 24 | public async Task Dev_token_can_append_and_list_human_event() |
| 25 | { |
| 26 | var teamId = "dev-test-team-" + Guid.NewGuid().ToString("N")[..8]; |
| 27 | const string devToken = "dev-intercom-local-change-me"; |
| 28 | |
| 29 | _client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", devToken); |
| 30 | |
| 31 | await _client.GetAsync($"/api/v1/teams/{teamId}"); |
| 32 | var topics = await _client.GetFromJsonAsync<List<TopicDto>>($"/api/v1/teams/{teamId}/topics"); |
| 33 | Assert.NotNull(topics); |
| 34 | Assert.NotEmpty(topics); |
| 35 | |
| 36 | var topicId = topics![0].TopicId; |
| 37 | var clientEventId = Guid.NewGuid().ToString("N"); |
| 38 | var payload = JsonSerializer.SerializeToElement(new |
| 39 | { |
| 40 | message_id = clientEventId, |
| 41 | role = "user", |
| 42 | content = "hello from test", |
| 43 | thread_id = Guid.NewGuid().ToString("N"), |
| 44 | }, IntercomJson.Web); |
| 45 | |
| 46 | var appendBody = new AppendEventRequest( |
| 47 | SchemaVersion: 1, |
| 48 | ClientEventId: clientEventId, |
| 49 | OccurredAtUtc: DateTimeOffset.UtcNow.ToString("O"), |
| 50 | EventKind: "message_added", |
| 51 | Sender: new SenderDto("dev-member", "Dev Operator", "human", "cide"), |
| 52 | Payload: payload); |
| 53 | |
| 54 | var post = await _client.PostAsJsonAsync($"/api/v1/topics/{topicId}/events", appendBody, IntercomJson.Web); |
| 55 | post.EnsureSuccessStatusCode(); |
| 56 | |
| 57 | var listed = await _client.GetFromJsonAsync<List<TransportEventEnvelopeDto>>( |
| 58 | $"/api/v1/topics/{topicId}/events"); |
| 59 | Assert.NotNull(listed); |
| 60 | Assert.Contains(listed!, x => x.ClientEventId == clientEventId); |
| 61 | } |
| 62 | } |
| 63 | |
| 64 | // Fix typo in test - AuthenticationHeaderValue not HeaderValue |
| 65 | |