import { describe, expect, it } from 'vitest'; import { parseRemotes, upstreamRemote } from '../src/upstream.js'; const LISTING = [ 'remote.origin.url atproto://alice.example/demo-app', 'remote.mine.url atproto://bob.example/demo-app', 'remote.github.url git@github.com:someone/demo-app.git', '', ].join('\n'); describe('parseRemotes', () => { it('reads each remote and its URL, and nothing else', () => { expect(parseRemotes(LISTING)).toEqual([ { name: 'origin', url: 'atproto://alice.example/demo-app' }, { name: 'mine', url: 'atproto://bob.example/demo-app' }, { name: 'github', url: 'git@github.com:someone/demo-app.git' }, ]); expect(parseRemotes('')).toEqual([]); expect( parseRemotes('remote.origin.fetch +refs/heads/*:refs/remotes/origin/*'), ).toEqual([]); }); }); describe('upstreamRemote', () => { const remotes = parseRemotes(LISTING); it('names the atproto remote the copy came from, when pushing to another account', () => { expect( upstreamRemote(remotes, { authority: 'bob.example', repoName: 'demo-app', }), ).toEqual({ name: 'origin', authority: 'alice.example', repoName: 'demo-app', }); }); it('names nothing when pushing back to where the copy came from', () => { expect( upstreamRemote( [{ name: 'origin', url: 'atproto://alice.example/demo-app' }], { authority: 'Alice.Example', repoName: 'demo-app' }, ), ).toBeNull(); }); it('ignores a remote under another name, a non-atproto remote, and a space', () => { expect( upstreamRemote( [ { name: 'origin', url: 'atproto://alice.example/other' }, { name: 'github', url: 'https://github.com/x/demo-app.git' }, { name: 'team', url: 'atproto://alice.example/space/com.example.t/s/demo-app', }, ], { authority: 'bob.example', repoName: 'demo-app' }, ), ).toBeNull(); }); it('prefers origin where several remotes fit, and takes the first otherwise', () => { const several = [ { name: 'carol', url: 'atproto://carol.example/demo-app' }, { name: 'origin', url: 'atproto://alice.example/demo-app' }, ]; expect( upstreamRemote(several, { authority: 'bob.example', repoName: 'demo-app', })?.authority, ).toBe('alice.example'); expect( upstreamRemote(several.slice(0, 1), { authority: 'bob.example', repoName: 'demo-app', })?.authority, ).toBe('carol.example'); }); it('names nothing for a push into a space', () => { expect( upstreamRemote(remotes, { authority: 'bob.example', repoName: 'demo-app', space: 'at://did:plc:x/com.example.t/s', }), ).toBeNull(); }); });