dawarich/spec/swagger/api/v1/owntracks/points_controller_spec.rb
2025-07-02 23:50:32 +02:00

92 lines
3.9 KiB
Ruby

# frozen_string_literal: true
require 'swagger_helper'
describe 'OwnTracks Points API', type: :request do
path '/api/v1/owntracks/points' do
post 'Creates a point' do
request_body_example value: {
'batt': 85,
'lon': -74.0060,
'acc': 8,
'bs': 2,
'inrids': [
'5f1d1b'
],
'BSSID': 'b0:f2:8:45:94:33',
'SSID': 'Home Wifi',
'vac': 3,
'inregions': [
'home'
],
'lat': 40.7128,
'topic': 'owntracks/jane/iPhone 12 Pro',
't': 'p',
'conn': 'w',
'm': 1,
'tst': 1_706_965_203,
'alt': 41,
'_type': 'location',
'tid': 'RO',
'_http': true,
'ghash': 'u33d773',
'isorcv': '2024-02-03T13:00:03Z',
'isotst': '2024-02-03T13:00:03Z',
'disptst': '2024-02-03 13:00:03'
}
tags 'Points'
consumes 'application/json'
parameter name: :point, in: :body, schema: {
type: :object,
properties: {
batt: { type: :number, description: 'Device battery level (percentage)' },
lon: { type: :number, description: 'Longitude coordinate' },
acc: { type: :number, description: 'Accuracy of position in meters' },
bs: { type: :number, description: 'Battery status (0=unknown, 1=unplugged, 2=charging, 3=full)' },
inrids: { type: :array, items: { type: :string }, description: 'Array of region IDs device is currently in' },
BSSID: { type: :string, description: 'Connected WiFi access point MAC address' },
SSID: { type: :string, description: 'Connected WiFi network name' },
vac: { type: :number, description: 'Vertical accuracy in meters' },
inregions: { type: :array, items: { type: :string }, description: 'Array of region names device is currently in' },
lat: { type: :number, description: 'Latitude coordinate' },
topic: { type: :string, description: 'MQTT topic in format owntracks/user/device' },
t: { type: :string, description: 'Type of message (p=position, c=circle, etc)' },
conn: { type: :string, description: 'Connection type (w=wifi, m=mobile, o=offline)' },
m: { type: :number, description: 'Motion state (0=stopped, 1=moving)' },
tst: { type: :number, description: 'Timestamp in Unix epoch time' },
alt: { type: :number, description: 'Altitude in meters' },
_type: { type: :string, description: 'Internal message type (usually "location")' },
tid: { type: :string, description: 'Tracker ID used to display the initials of a user' },
_http: { type: :boolean, description: 'Whether message was sent via HTTP (true) or MQTT (false)' },
ghash: { type: :string, description: 'Geohash of location' },
isorcv: { type: :string, description: 'ISO 8601 timestamp when message was received' },
isotst: { type: :string, description: 'ISO 8601 timestamp of the location fix' },
disptst: { type: :string, description: 'Human-readable timestamp of the location fix' }
},
required: %w[lat lon tst _type]
}
parameter name: :api_key, in: :query, type: :string, required: true, description: 'API Key'
response '200', 'Point created' do
let(:file_path) { 'spec/fixtures/files/owntracks/2024-03.rec' }
let(:file) { File.read(file_path) }
let(:json) { OwnTracks::RecParser.new(file).call }
let(:point) { json.first }
let(:api_key) { create(:user).api_key }
run_test!
end
response '401', 'Unauthorized' do
let(:file_path) { 'spec/fixtures/files/owntracks/2024-03.rec' }
let(:file) { File.read(file_path) }
let(:json) { OwnTracks::RecParser.new(file).call }
let(:point) { json.first }
let(:api_key) { nil }
run_test!
end
end
end
end