You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							62 lines
						
					
					
						
							1.9 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							62 lines
						
					
					
						
							1.9 KiB
						
					
					
				
								// k6 run k6/poll-ack-smoke.js
							 | 
						|
								import http from 'k6/http';
							 | 
						|
								import { check, sleep } from 'k6';
							 | 
						|
								import { Trend, Counter } from 'k6/metrics';
							 | 
						|
								
							 | 
						|
								const latency = new Trend('api_latency');
							 | 
						|
								const throttles = new Counter('rate_limits');
							 | 
						|
								
							 | 
						|
								export const options = { vus: 5, duration: '1m' };
							 | 
						|
								
							 | 
						|
								const BASE = __ENV.API || 'https://api.endorser.ch';
							 | 
						|
								const JWT  = __ENV.JWT || 'REDACTED';
							 | 
						|
								
							 | 
						|
								function idem() { return crypto.randomUUID(); }
							 | 
						|
								
							 | 
						|
								export default function () {
							 | 
						|
								  // POLL (simulate occasional 429 / 5xx via test env or chaos flag)
							 | 
						|
								  const pollRes = http.post(
							 | 
						|
								    `${BASE}/api/v2/report/plansLastUpdatedBetween`,
							 | 
						|
								    JSON.stringify({ planIds: ['demo1','demo2'], limit: 3, afterId: __ITER === 0 ? undefined : __ENV.AFTER }),
							 | 
						|
								    {
							 | 
						|
								      headers: {
							 | 
						|
								        'Authorization': `Bearer ${JWT}`,
							 | 
						|
								        'Content-Type': 'application/json',
							 | 
						|
								        'X-Idempotency-Key': idem(),
							 | 
						|
								        'X-Client-Version': 'TimeSafari-Plugin/1.0.0'
							 | 
						|
								      },
							 | 
						|
								      tags: { endpoint: 'poll' }
							 | 
						|
								    }
							 | 
						|
								  );
							 | 
						|
								
							 | 
						|
								  latency.add(pollRes.timings.duration);
							 | 
						|
								
							 | 
						|
								  if (pollRes.status === 429) throttles.add(1);
							 | 
						|
								
							 | 
						|
								  check(pollRes, {
							 | 
						|
								    'poll: 2xx or 429/5xx with JSON': (r) => [200,429,500,503].includes(r.status) && r.headers['Content-Type']?.includes('application/json'),
							 | 
						|
								  });
							 | 
						|
								
							 | 
						|
								  if (pollRes.status === 200) {
							 | 
						|
								    const body = pollRes.json();
							 | 
						|
								    const ids = (body?.data || []).map(x => x?.planSummary?.jwtId).filter(Boolean);
							 | 
						|
								    // ACK
							 | 
						|
								    if (ids.length) {
							 | 
						|
								      const ackRes = http.post(
							 | 
						|
								        `${BASE}/api/v2/plans/acknowledge`,
							 | 
						|
								        JSON.stringify({ acknowledgedJwtIds: ids, acknowledgedAt: new Date().toISOString(), clientVersion: 'TimeSafari-Plugin/1.0.0' }),
							 | 
						|
								        {
							 | 
						|
								          headers: {
							 | 
						|
								            'Authorization': `Bearer ${JWT}`,
							 | 
						|
								            'Content-Type': 'application/json',
							 | 
						|
								            'X-Idempotency-Key': idem()
							 | 
						|
								          },
							 | 
						|
								          tags: { endpoint: 'ack' }
							 | 
						|
								        }
							 | 
						|
								      );
							 | 
						|
								      check(ackRes, { 'ack: success/idem': (r) => [200, 409].includes(r.status) });
							 | 
						|
								    }
							 | 
						|
								  }
							 | 
						|
								
							 | 
						|
								  sleep(1);
							 | 
						|
								}
							 | 
						|
								
							 |