File

spec/util_datetime_spec.lua @ 13146:771eb453e03a

util.sqlite3: Deduplicate query methods There were 3 very similar methods: - :execute() - :execute_query() - :execute_update() The first one returns the prepared statement and is mainly used internally in the library for CREATE statements. The later two only really differ in how the results are returned. Those two are one main method and one small one that only picks out the iterator.
author Kim Alvefur <zash@zash.se>
date Sat, 10 Jun 2023 22:02:15 +0200
parent 12755:a09dacf660d2
line wrap: on
line source

local util_datetime = require "util.datetime";

describe("util.datetime", function ()
	it("should have been loaded", function ()
		assert.is_table(util_datetime);
	end);
	describe("#date", function ()
		local date = util_datetime.date;
		it("should exist", function ()
			assert.is_function(date);
		end);
		it("should return a string", function ()
			assert.is_string(date());
		end);
		it("should look like a date", function ()
			assert.truthy(string.find(date(), "^%d%d%d%d%-%d%d%-%d%d$"));
		end);
		it("should work", function ()
			assert.equals("2006-01-02", date(1136239445));
		end);
		it("should ignore fractional parts", function ()
			assert.equals("2006-01-02", date(1136239445.5));
		end);
	end);
	describe("#time", function ()
		local time = util_datetime.time;
		it("should exist", function ()
			assert.is_function(time);
		end);
		it("should return a string", function ()
			assert.is_string(time());
		end);
		it("should look like a timestamp", function ()
			-- Note: Sub-second precision and timezones are ignored
			assert.truthy(string.find(time(), "^%d%d:%d%d:%d%d"));
		end);
		it("should work", function ()
			assert.equals("22:04:05", time(1136239445));
		end);
		it("should handle precision", function ()
			assert.equal("14:46:31.158200", time(1660488391.1582))
			assert.equal("14:46:32.158200", time(1660488392.1582))
			assert.equal("14:46:33.158200", time(1660488393.1582))
			assert.equal("14:46:33.999900", time(1660488393.9999))
		end)
	end);
	describe("#datetime", function ()
		local datetime = util_datetime.datetime;
		it("should exist", function ()
			assert.is_function(datetime);
		end);
		it("should return a string", function ()
			assert.is_string(datetime());
		end);
		it("should look like a timestamp", function ()
			-- Note: Sub-second precision and timezones are ignored
			assert.truthy(string.find(datetime(), "^%d%d%d%d%-%d%d%-%d%dT%d%d:%d%d:%d%d"));
		end);
		it("should work", function ()
			assert.equals("2006-01-02T22:04:05Z", datetime(1136239445));
		end);
		it("should handle precision", function ()
			assert.equal("2022-08-14T14:46:31.158200Z", datetime(1660488391.1582))
			assert.equal("2022-08-14T14:46:32.158200Z", datetime(1660488392.1582))
			assert.equal("2022-08-14T14:46:33.158200Z", datetime(1660488393.1582))
			assert.equal("2022-08-14T14:46:33.999900Z", datetime(1660488393.9999))
		end)
	end);
	describe("#legacy", function ()
		local legacy = util_datetime.legacy;
		it("should exist", function ()
			assert.is_function(legacy);
		end);
		it("should not add precision", function ()
			assert.equal("20220814T14:46:31", legacy(1660488391.1582));
		end);
	end);
	describe("#parse", function ()
		local parse = util_datetime.parse;
		it("should exist", function ()
			assert.is_function(parse);
		end);
		it("should work", function ()
			-- Timestamp used by Go
			assert.equals(1511114293, parse("2017-11-19T17:58:13Z"));
			assert.equals(1511114330, parse("2017-11-19T18:58:50+0100"));
			assert.equals(1136239445, parse("2006-01-02T15:04:05-0700"));
			assert.equals(1136239445, parse("2006-01-02T15:04:05-07"));
		end);
		it("should handle timezones", function ()
			-- https://xmpp.org/extensions/xep-0082.html#example-2 and 3
			assert.equals(parse("1969-07-21T02:56:15Z"), parse("1969-07-20T21:56:15-05:00"));
		end);
		it("should handle precision", function ()
			-- floating point comparison is not an exact science
			assert.truthy(math.abs(1660488392.1582 - parse("2022-08-14T14:46:32.158200Z")) < 0.001)
		end)
		it("should return nil when given invalid inputs", function ()
			assert.is_nil(parse(nil));
			assert.is_nil(parse("hello world"));
			assert.is_nil(parse("2017-11-19T18:58:50$0100"));
		end);
	end);
end);