-- Reimplement encode/decode locally for testing (same logic as sessions.lua) local encode = function ( data ) vim.validate('data', data, 'string') -- replace some chars in base64, that are not allowed in file names. return vim.base64.encode( data ):gsub( '%+', '-' ):gsub( '%/', '.' ):gsub( '%=', '_' ) end local decode = function ( data ) vim.validate('data', data, 'string') return vim.base64.decode( data:gsub( '%-', '+' ):gsub( '%.', '/' ):gsub( '%_', '=' ) ) end describe('bugabinga.sessions encode/decode', function() describe('encode', function() it('should roundtrip hello correctly', function() local encoded = encode('hello') local decoded = decode(encoded) assert.equal('hello', decoded) end) it('should replace base64 / with . in test/path', function() -- base64 of "test/path" contains / which should become . local encoded = encode('test/path') -- Verify no / remains (it should be replaced with .) assert.is_not_matches('%/', encoded) -- Verify roundtrip works assert.equal('test/path', decode(encoded)) end) it('should replace + and / in test+path/value', function() -- base64 of "test+path/value" contains + and / which should become - and . local encoded = encode('test+path/value') -- Verify no + or / remains assert.is_not_matches('%+', encoded) assert.is_not_matches('%/', encoded) -- Verify roundtrip works assert.equal('test+path/value', decode(encoded)) end) it('should handle empty string', function() local encoded = encode('') assert.equal('', encoded) end) it('should roundtrip unicode correctly', function() local original = '日本語' local encoded = encode(original) local decoded = decode(encoded) assert.equal(original, decoded) end) it('should error when called with non-string (number)', function() local ok, err = pcall(encode, 123) assert.is_false(ok) assert.matches('data', err) end) end) describe('decode', function() it('should roundtrip hello correctly', function() local encoded = encode('hello') local decoded = decode(encoded) assert.equal('hello', decoded) end) it('should roundtrip unicode correctly', function() local original = '日本語' local encoded = encode(original) local decoded = decode(encoded) assert.equal(original, decoded) end) it('should error when called with non-string (nil)', function() local ok, err = pcall(decode, nil) assert.is_false(ok) assert.matches('data', err) end) end) end)